Facebook
From Andriy Bochkov, 3 Years ago, written in C#.
Embed
Download Paste or View Raw
Hits: 62
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using FemGame;
  5. using UnityEngine.UI;
  6. using System;
  7. using Firebase.Analytics;
  8.  
  9. public class QuestHandler : MonoBehaviour
  10. {
  11.     [Header("Scenario Debug")]
  12.     public Scenario scenario;
  13.  
  14.     [Header("References")]
  15.     public Image BackgroundImage;
  16.     public Image BackgroundBlurImage;
  17.     public PersonsPanelController PersonsPanelController;
  18.     public ChoiceController ChoiceController;
  19.     public Button BagButton;
  20.     public Button EnergyButton;
  21.     public Button InteractionPanel;
  22.  
  23.     [Header("Parameters")]
  24.     public List<Sprite> energyIcons;
  25.  
  26.     [Header("Prefabs")]
  27.     public GameObject VoiceOverPrefab;
  28.     public GameObject MiniGamePrefab;
  29.  
  30.     [Header("Variables")]
  31.     public string sceneID;
  32.     public int blockID;
  33.     public int minigameStartCost = Convert.ToInt32(Firebase.RemoteConfig.FirebaseRemoteConfig.GetValue(StringConstants.START_MINI_GAME_COST).LongValue);
  34.     public int minigameRestartCost = Convert.ToInt32(Firebase.RemoteConfig.FirebaseRemoteConfig.GetValue(StringConstants.RESTART_MINI_GAME_COST).LongValue);
  35.  
  36.     private static QuestHandler Instance;
  37.     public static QuestHandler GetInstance() { return Instance; }
  38.    
  39.     public static ScenarioPoint ActiveScenarioPoint = ScenarioPoint.START;
  40.     public void Start()
  41.     {
  42.         Instance = this;
  43.  
  44.         StartScenario(PlayerSave.ActiveSave.scenarioPoint);
  45.         GenerateUI();
  46.     }
  47.  
  48.     public void Awake()
  49.     {
  50.         Instance = this;
  51.     }
  52.  
  53.     public void GenerateUI() {
  54.         BagButton.onClick.AddListener(() =>
  55.         {
  56.             SoundController.Instance.PlaySfx("UI/Button Tap");
  57.            
  58.             PersonsPanelController.ShowBlur();
  59.             PrefabsController.OpenPrefabUI("Bag");
  60.         });
  61.         EnergyButton.onClick.AddListener(() => PrefabsController.OpenPrefabUI("Purchasing"));
  62.  
  63.         PlayerSave.ActiveSave.energy.OnValueChange(() => Update());        
  64.         void Update()
  65.         {
  66.             EnergyButton.GetComponent<Image>().sprite = energyIcons[(int)(PlayerSave.ActiveSave.energy.Progress * 5)];
  67.         }
  68.     }
  69.  
  70.     public void RestoreScenario(ScenarioPoint scenarioPoint)
  71.     {
  72.         Scene scene = ScenarioController.ActiveScenario.scenario.Find(x => x.nodeID == scenarioPoint.sceneID);
  73.         Scene downgradingScene = scene;
  74.  
  75.         List<Scene> historyScenes = new List<Scene>();
  76.  
  77.         while (ScenarioController.HasParentByScene(downgradingScene)) {
  78.             downgradingScene = ScenarioController.GetParentByScene(downgradingScene);
  79.  
  80.             historyScenes.Add(downgradingScene);
  81.         }
  82.  
  83.         historyScenes.Reverse();
  84.         historyScenes.ForEach(obj =>
  85.         {
  86.             this.sceneID = obj.nodeID;
  87.             obj.blocks.WithIndex().ForEach((blockObj) =>
  88.             {
  89.                 this.blockID = blockObj.Key;
  90.  
  91.                 if (blockObj.Value is BackgroundAction || blockObj.Value is PersonAction)
  92.                     blockObj.Value.Execute((x) => { });
  93.             });
  94.         });
  95.  
  96.         scene.blocks.WithIndex().ForEach((obj) => {
  97.             if (obj.Key < scenarioPoint.blockID) {
  98.                 this.sceneID = scenarioPoint.sceneID;
  99.                 this.blockID = obj.Key;
  100.  
  101.                 if (obj.Value is BackgroundAction || obj.Value is PersonAction)
  102.                     obj.Value.Execute((x) => { });
  103.             }
  104.         });
  105.     }
  106.  
  107.     public void OpenFinalScene() {
  108.         MainMenuController.IS_FINAL_SCENE = true;
  109.         UnityEngine.SceneManagement.SceneManager.LoadScene(0);
  110.  
  111.         SoundController.Instance.Stop();
  112.     }
  113.  
  114.     public void StartScenario(ScenarioPoint scenarioPoint) {
  115.         Scene activeScene = ScenarioController.ActiveScenario.scenario.Find(x => x.nodeID == scenarioPoint.sceneID);
  116.         Block activeBlock = activeScene.blocks[scenarioPoint.blockID];
  117.  
  118.         RestoreScenario(scenarioPoint);
  119.         StartBlock(scenarioPoint.sceneID, scenarioPoint.blockID);
  120.     }
  121.  
  122.     public void StartBlock(string sceneID, int blockID) {
  123.         PlayerSave.ActiveSave.scenarioPoint = new ScenarioPoint(sceneID, blockID);
  124.         PlayerSave.Save();
  125.  
  126.         Scene activeScene = ScenarioController.ActiveScenario.scenario.Find(x => x.nodeID == sceneID);
  127.         Block activeBlock = activeScene.blocks[blockID];
  128.  
  129.         this.sceneID = sceneID;
  130.         this.blockID = blockID;
  131.  
  132.         print(this.sceneID + ":" + this.blockID);
  133.  
  134.         activeBlock.Execute((@event) => {
  135.             if (@event == ActionEvent.NONE)
  136.             {
  137.                 if (activeScene.blocks.HasKey(blockID + 1))
  138.                     StartBlock(sceneID, ++blockID);
  139.                 else StartBlock(activeScene.nextScene, 0);
  140.             }
  141.             else if (@event == ActionEvent.FINAL) OpenFinalScene();
  142.             else StartBlock(@event.sceneEvent, 0);
  143.         });
  144.     }
  145.    
  146.     public void OnInteraction(Action onInteraction) {
  147.         InteractionPanel.onClick.RemoveAllListeners();
  148.  
  149.         InteractionPanel.onClick.AddListener(() =>
  150.         {
  151.             SoundController.Instance.PlaySfx("UI/Voiceover Tap");
  152.            
  153.             InteractionPanel.onClick.RemoveAllListeners();
  154.             onInteraction.Invoke();
  155.         });
  156.     }
  157.  
  158.     private Action onNextBlock = () => { };
  159.     public void ExecuteBlock(BackgroundAction actionBlock, Action<ActionEvent> onComplete) {
  160.         string backgroundFileName = actionBlock.background.Substring(0, actionBlock.background.Length - (System.IO.Path.GetExtension(actionBlock.background)).Length);
  161.  
  162.         if (Resources.Load<Sprite>("Scenario/Background/" + backgroundFileName) == null) {
  163.             onComplete.Invoke(ActionEvent.NONE);
  164.             return;
  165.         }
  166.  
  167.         BackgroundImage.sprite =
  168.             Resources.Load<Sprite>("Scenario/Background/" + backgroundFileName);
  169.         BackgroundBlurImage.sprite =
  170.             Resources.Load<Sprite>("Scenario/Background/Blur/" + backgroundFileName);
  171.  
  172.         onComplete.Invoke(ActionEvent.NONE);
  173.     }
  174.  
  175.     public void ExecuteBlock(VoiceOver actionBlock, Action<ActionEvent> onComplete)
  176.     {
  177.                 SoundController.Instance.PlaySfx("UI/Voiceover Tap");
  178.                
  179.         onNextBlock.Invoke();
  180.         PersonsPanelController.HideBlur();
  181.         GameObject VoiceOverObject = Instantiate(VoiceOverPrefab, PersonsPanelController.transform);
  182.  
  183.         VoiceOverObject.transform.Find("Text").GetComponent<Text>().text = actionBlock.message;
  184.  
  185.         onNextBlock = () =>
  186.         {
  187.             Destroy(VoiceOverObject);
  188.         };
  189.         OnInteraction(() =>
  190.         {
  191.             onComplete.Invoke(ActionEvent.NONE);
  192.         });
  193.     }
  194.  
  195.     public void ExecuteBlock(PersonAction actionBlock, Action<ActionEvent> onComplete)
  196.     {
  197.         onNextBlock.Invoke();
  198.  
  199.         switch (actionBlock.action) {
  200.             case PersonAction.ENTER:
  201.                 PersonsPanelController.Join(ScenarioController.ActiveScenario.persons[actionBlock.target]);
  202.  
  203.                 if (actionBlock.emotion != null)
  204.                     PersonsPanelController.SetEmotion(ScenarioController.ActiveScenario.persons[actionBlock.target], actionBlock.emotion);
  205.                 TimeUtility.Delay(0.5f, () =>
  206.                 {
  207.                     onComplete.Invoke(ActionEvent.NONE);
  208.                 });
  209.                 break;
  210.             case PersonAction.LEAVE:
  211.                 PersonsPanelController.Exit(ScenarioController.ActiveScenario.persons[actionBlock.target]);  
  212.                 onComplete.Invoke(ActionEvent.NONE);
  213.                 break;
  214.         }
  215.     }
  216.  
  217.     public void ExecuteBlock(Message actionBlock, Action<ActionEvent> onComplete)
  218.     {
  219.                 SoundController.Instance.PlaySfx("UI/Voiceover Tap");
  220.                
  221.         onNextBlock.Invoke();
  222.         PersonsPanelController.ShowBlur();
  223.  
  224.         if (PersonsPanelController.persons.ContainsKey(ScenarioController.ActiveScenario.persons[actionBlock.target].name))
  225.         {
  226.             PersonsPanelController.ShowBubble(actionBlock.message, ScenarioController.ActiveScenario.persons[actionBlock.target]);
  227.  
  228.             if (actionBlock.emotion != null)
  229.                 PersonsPanelController.SetEmotion(ScenarioController.ActiveScenario.persons[actionBlock.target], actionBlock.emotion);
  230.         }
  231.         else
  232.             PersonsPanelController.ShowMiniatureBubble(actionBlock.message, ScenarioController.ActiveScenario.persons[actionBlock.target]);
  233.  
  234.         onNextBlock = () =>
  235.         {
  236.             PersonsPanelController.HideAllBubbles();
  237.         };
  238.  
  239.         OnInteraction(() =>
  240.         {
  241.             onComplete.Invoke(ActionEvent.NONE);
  242.         });
  243.     }
  244.  
  245.     public void ExecuteBlock(Choice actionBlock, Action<ActionEvent> onComplete)
  246.     {
  247.                 SoundController.Instance.PlaySfx("UI/Choice Buttons Whoosh");
  248.                
  249.         onNextBlock.Invoke();
  250.  
  251.         PersonsPanelController.HidePersons();
  252.         PersonsPanelController.HideBlur();
  253.  
  254.         ChoiceController.gameObject.SetActive(true);
  255.         ChoiceController.Generate(actionBlock, (@event) => {
  256.             onNextBlock = () =>
  257.             {  
  258.                 PersonsPanelController.ShowPersons();
  259.             };
  260.  
  261.             ChoiceController.gameObject.SetActive(false);
  262.             onComplete.Invoke(new ActionEvent(@event));
  263.         });
  264.     }
  265.  
  266.     public void ExecuteBlock(MiniGame actionBlock, Action<ActionEvent> onComplete) {
  267.  
  268.         ExecuteBlock(new Choice(new List<ChoiceOption>() { new ChoiceOption(actionBlock.message, actionBlock.winEvent, minigameStartCost) }), (@event) =>
  269.         {
  270.             GameObject MiniGame = Instantiate(MiniGamePrefab, GameObject.Find("Canvas").transform);
  271.  
  272.             MiniGame.transform.Find("MainPanel").GetComponent<MiniGameController>().Initialize(actionBlock.itemCollection, actionBlock.goal);
  273.  
  274.             PersonsPanelController.ShowBlur();
  275.  
  276.             FirebaseAnalytics.LogEvent("MiniGame", new Parameter("winEvent", actionBlock.winEvent));
  277.  
  278.             MiniGameController.OnWin(() =>
  279.             {
  280.                 FirebaseAnalytics.LogEvent("MiniGame", new Parameter("goal", actionBlock.goal));
  281.                 QuestHandler.ActiveScenarioPoint = new ScenarioPoint(actionBlock.winEvent, 0);
  282.                 PersonsPanelController.HideBlur();
  283.                 StartBlock(actionBlock.winEvent, 0);
  284.                 Destroy(MiniGame);
  285.  
  286.             });
  287.         });
  288.     }
  289. }