using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FemGame;
using UnityEngine.UI;
using System;
using Firebase.Analytics;
public class QuestHandler : MonoBehaviour
{
[Header("Scenario Debug")]
public Scenario scenario;
[Header("References")]
public Image BackgroundImage;
public Image BackgroundBlurImage;
public PersonsPanelController PersonsPanelController;
public ChoiceController ChoiceController;
public Button BagButton;
public Button EnergyButton;
public Button InteractionPanel;
[Header("Parameters")]
public List<Sprite> energyIcons;
[Header("Prefabs")]
public GameObject VoiceOverPrefab;
public GameObject MiniGamePrefab;
[Header("Variables")]
public string sceneID;
public int blockID;
public int minigameStartCost = Convert.ToInt32(Firebase.RemoteConfig.FirebaseRemoteConfig.GetValue(StringConstants.START_MINI_GAME_COST).LongValue);
public int minigameRestartCost = Convert.ToInt32(Firebase.RemoteConfig.FirebaseRemoteConfig.GetValue(StringConstants.RESTART_MINI_GAME_COST).LongValue);
private static QuestHandler Instance;
public static QuestHandler GetInstance() { return Instance; }
public static ScenarioPoint ActiveScenarioPoint = ScenarioPoint.START;
public void Start()
{
Instance = this;
StartScenario(PlayerSave.ActiveSave.scenarioPoint);
GenerateUI();
}
public void Awake()
{
Instance = this;
}
public void GenerateUI() {
BagButton.onClick.AddListener(() =>
{
SoundController.Instance.PlaySfx("UI/Button Tap");
PersonsPanelController.ShowBlur();
PrefabsController.OpenPrefabUI("Bag");
});
EnergyButton.onClick.AddListener(() => PrefabsController.OpenPrefabUI("Purchasing"));
PlayerSave.ActiveSave.energy.OnValueChange(() => Update());
void Update()
{
EnergyButton.GetComponent<Image>().sprite = energyIcons[(int)(PlayerSave.ActiveSave.energy.Progress * 5)];
}
}
public void RestoreScenario(ScenarioPoint scenarioPoint)
{
Scene scene = ScenarioController.ActiveScenario.scenario.Find(x => x.nodeID == scenarioPoint.sceneID);
Scene downgradingScene = scene;
List
<Scene
> historyScenes
= new List
<Scene
>();
while (ScenarioController.HasParentByScene(downgradingScene)) {
downgradingScene = ScenarioController.GetParentByScene(downgradingScene);
historyScenes.Add(downgradingScene);
}
historyScenes.Reverse();
historyScenes.ForEach(obj =>
{
this.sceneID = obj.nodeID;
obj.blocks.WithIndex().ForEach((blockObj) =>
{
this.blockID = blockObj.Key;
if (blockObj
.Value is BackgroundAction
|| blockObj
.Value is PersonAction
)
blockObj.Value.Execute((x) => { });
});
});
scene.blocks.WithIndex().ForEach((obj) => {
if (obj.Key < scenarioPoint.blockID) {
this.sceneID = scenarioPoint.sceneID;
this.blockID = obj.Key;
if (obj
.Value is BackgroundAction
|| obj
.Value is PersonAction
)
obj.Value.Execute((x) => { });
}
});
}
public void OpenFinalScene() {
MainMenuController.IS_FINAL_SCENE = true;
UnityEngine.SceneManagement.SceneManager.LoadScene(0);
SoundController.Instance.Stop();
}
public void StartScenario(ScenarioPoint scenarioPoint) {
Scene activeScene = ScenarioController.ActiveScenario.scenario.Find(x => x.nodeID == scenarioPoint.sceneID);
Block activeBlock = activeScene.blocks[scenarioPoint.blockID];
RestoreScenario(scenarioPoint);
StartBlock(scenarioPoint.sceneID, scenarioPoint.blockID);
}
public void StartBlock(string sceneID, int blockID) {
PlayerSave
.ActiveSave.scenarioPoint = new ScenarioPoint
(sceneID, blockID
);
PlayerSave.Save();
Scene activeScene = ScenarioController.ActiveScenario.scenario.Find(x => x.nodeID == sceneID);
Block activeBlock = activeScene.blocks[blockID];
this.sceneID = sceneID;
this.blockID = blockID;
print(this.sceneID + ":" + this.blockID);
activeBlock.Execute((@event) => {
if (@event == ActionEvent.NONE)
{
if (activeScene.blocks.HasKey(blockID + 1))
StartBlock(sceneID, ++blockID);
else StartBlock(activeScene.nextScene, 0);
}
else if (@event == ActionEvent.FINAL) OpenFinalScene();
else StartBlock(@event.sceneEvent, 0);
});
}
public void OnInteraction(Action onInteraction) {
InteractionPanel.onClick.RemoveAllListeners();
InteractionPanel.onClick.AddListener(() =>
{
SoundController.Instance.PlaySfx("UI/Voiceover Tap");
InteractionPanel.onClick.RemoveAllListeners();
onInteraction.Invoke();
});
}
private Action onNextBlock = () => { };
public void ExecuteBlock(BackgroundAction actionBlock, Action<ActionEvent> onComplete) {
string backgroundFileName = actionBlock.background.Substring(0, actionBlock.background.Length - (System.IO.Path.GetExtension(actionBlock.background)).Length);
if (Resources.Load<Sprite>("Scenario/Background/" + backgroundFileName) == null) {
onComplete.Invoke(ActionEvent.NONE);
return;
}
BackgroundImage.sprite =
Resources.Load<Sprite>("Scenario/Background/" + backgroundFileName);
BackgroundBlurImage.sprite =
Resources.Load<Sprite>("Scenario/Background/Blur/" + backgroundFileName);
onComplete.Invoke(ActionEvent.NONE);
}
public void ExecuteBlock(VoiceOver actionBlock, Action<ActionEvent> onComplete)
{
SoundController.Instance.PlaySfx("UI/Voiceover Tap");
onNextBlock.Invoke();
PersonsPanelController.HideBlur();
GameObject VoiceOverObject = Instantiate(VoiceOverPrefab, PersonsPanelController.transform);
VoiceOverObject.transform.Find("Text").GetComponent<Text>().text = actionBlock.message;
onNextBlock = () =>
{
Destroy(VoiceOverObject);
};
OnInteraction(() =>
{
onComplete.Invoke(ActionEvent.NONE);
});
}
public void ExecuteBlock(PersonAction actionBlock, Action<ActionEvent> onComplete)
{
onNextBlock.Invoke();
switch (actionBlock.action) {
case PersonAction.ENTER:
PersonsPanelController.Join(ScenarioController.ActiveScenario.persons[actionBlock.target]);
if (actionBlock.emotion != null)
PersonsPanelController.SetEmotion(ScenarioController.ActiveScenario.persons[actionBlock.target], actionBlock.emotion);
TimeUtility.Delay(0.5f, () =>
{
onComplete.Invoke(ActionEvent.NONE);
});
break;
case PersonAction.LEAVE:
PersonsPanelController.Exit(ScenarioController.ActiveScenario.persons[actionBlock.target]);
onComplete.Invoke(ActionEvent.NONE);
break;
}
}
public void ExecuteBlock(Message actionBlock, Action<ActionEvent> onComplete)
{
SoundController.Instance.PlaySfx("UI/Voiceover Tap");
onNextBlock.Invoke();
PersonsPanelController.ShowBlur();
if (PersonsPanelController.persons.ContainsKey(ScenarioController.ActiveScenario.persons[actionBlock.target].name))
{
PersonsPanelController.ShowBubble(actionBlock.message, ScenarioController.ActiveScenario.persons[actionBlock.target]);
if (actionBlock.emotion != null)
PersonsPanelController.SetEmotion(ScenarioController.ActiveScenario.persons[actionBlock.target], actionBlock.emotion);
}
else
PersonsPanelController.ShowMiniatureBubble(actionBlock.message, ScenarioController.ActiveScenario.persons[actionBlock.target]);
onNextBlock = () =>
{
PersonsPanelController.HideAllBubbles();
};
OnInteraction(() =>
{
onComplete.Invoke(ActionEvent.NONE);
});
}
public void ExecuteBlock(Choice actionBlock, Action<ActionEvent> onComplete)
{
SoundController.Instance.PlaySfx("UI/Choice Buttons Whoosh");
onNextBlock.Invoke();
PersonsPanelController.HidePersons();
PersonsPanelController.HideBlur();
ChoiceController.gameObject.SetActive(true);
ChoiceController.Generate(actionBlock, (@event) => {
onNextBlock = () =>
{
PersonsPanelController.ShowPersons();
};
ChoiceController.gameObject.SetActive(false);
onComplete
.Invoke(new ActionEvent
(@
event));
});
}
public void ExecuteBlock(MiniGame actionBlock, Action<ActionEvent> onComplete) {
ExecuteBlock
(new Choice
(new List
<ChoiceOption
>() { new ChoiceOption
(actionBlock
.message, actionBlock
.winEvent, minigameStartCost
) }),
(@
event) =>
{
GameObject MiniGame = Instantiate(MiniGamePrefab, GameObject.Find("Canvas").transform);
MiniGame.transform.Find("MainPanel").GetComponent<MiniGameController>().Initialize(actionBlock.itemCollection, actionBlock.goal);
PersonsPanelController.ShowBlur();
FirebaseAnalytics
.LogEvent("MiniGame",
new Parameter
("winEvent", actionBlock
.winEvent));
MiniGameController.OnWin(() =>
{
FirebaseAnalytics
.LogEvent("MiniGame",
new Parameter
("goal", actionBlock
.goal));
QuestHandler
.ActiveScenarioPoint = new ScenarioPoint
(actionBlock
.winEvent,
0);
PersonsPanelController.HideBlur();
StartBlock(actionBlock.winEvent, 0);
Destroy(MiniGame);
});
});
}
}