Scriptum/Assets/Scripts/REFACTORING/Story/WizardHouse/WizardFirstQuestManager.cs
2023-01-06 21:54:50 +01:00

260 lines
8.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using GUI_Scripts.ProceduralGeneration;
using UnityEngine;
public enum WizzardMissionStateEnum
{
None = 0,
AcceptMission = 1,
WaitingForPeoggress = 2,
MainPlotIntroduction = 3
}
[RequireComponent(typeof(NPC))]
[RequireComponent(typeof(NpcMissionManager))]
public class WizardFirstQuestManager : MonoBehaviour
{
private Rigidbody2D myRigidbody;
public Animator anim;
public Vector3 homePosition;
public Transform targetPosition;
public AStarPathfindingAgent agent;
//public GameObject player;
public bool approaching = false;
//public bool isAfterAction = false; // after mission in this case
public WizzardMissionStateEnum MissionProggress = WizzardMissionStateEnum.None;
//public bool waitingForMissionEffects = false;
public bool isDuringConversation = false;
public float actionRadius = 1.5f;
void Awake()
{
agent = GetComponent<AStarPathfindingAgent>();
}
// Start is called before the first frame update
void Start()
{
gameObject.GetComponent<NpcMissionManager>().OpenInDefaultWay = false;
myRigidbody = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
homePosition = new Vector3(gameObject.transform.position.x, gameObject.transform.position.y, gameObject.transform.position.z);
targetPosition = GameObject.FindWithTag("Player").transform;
if (PlayerPrefs.HasKey(gameObject.GetComponent<NPC>().name + ".FirstMission"))
MissionProggress = (WizzardMissionStateEnum)PlayerPrefs.GetInt(gameObject.GetComponent<NPC>().name + ".FirstMission");
if (MissionProggress == WizzardMissionStateEnum.None)
StartCoroutine(WaitBeforStartingAction(5f));
else if (MissionProggress == WizzardMissionStateEnum.WaitingForPeoggress || MissionProggress == WizzardMissionStateEnum.MainPlotIntroduction)
{
approaching = false;
gameObject.GetComponent<NPC>().State = NPCStateEnum.Talking;
gameObject.GetComponent<NpcMissionManager>().OpenInDefaultWay = true;
}
}
// Update is called once per frame
public void Update()
{
HandleState();
}
private IEnumerator WaitBeforStartingAction(float waitTime)
{
while (true)
{
yield return new WaitForSeconds(waitTime);
// Start story
approaching = true;
gameObject.GetComponent<NPC>().State = NPCStateEnum.Walking;
}
}
private IEnumerator Wait(float waitTime)
{
while (true)
{
yield return new WaitForSeconds(waitTime);
}
}
public void CheckDistance()
{
anim.SetBool("isRunning", true);
StopAllCoroutines();
//if (isAfterAction == false && waitingForMissionEffects == false)
if (approaching && (MissionProggress == WizzardMissionStateEnum.None || MissionProggress == WizzardMissionStateEnum.AcceptMission))
{
if (approaching && Vector2.Distance(targetPosition.position, transform.position) >= actionRadius)
{
agent.FindPath();
StartCoroutine(agent.FollowPath());
}
else if (approaching)
{
//start dialogue here
gameObject.GetComponent<NpcMissionManager>().CanBeOpened = true;
gameObject.GetComponent<NPC>().State = NPCStateEnum.Talking;
if (targetPosition.position.y > transform.position.y)
{
anim.SetBool("TurnFront", true);
anim.SetBool("isRunning", false);
}
else
{
anim.SetBool("TurnFront", false);
anim.SetBool("isRunning", false);
}
agent.path.Clear(); // if we are able to talgk we dont want go go further player
}
}
else if (MissionProggress == WizzardMissionStateEnum.WaitingForPeoggress)
{
if (Vector2.Distance(transform.position, homePosition) > 0.95)
{
//transform.position = Vector2.MoveTowards(transform.position, homePosition, 2 * Time.deltaTime);
GoToHomePosition();
}
else
{
anim.SetBool("isRunning", false);
anim.SetBool("TurnFront", false);
gameObject.GetComponent<NPC>().State = NPCStateEnum.Pending;
}
}
else if (MissionProggress == WizzardMissionStateEnum.MainPlotIntroduction)
{
gameObject.GetComponent<NPC>().State = NPCStateEnum.Talking;
agent.path.Clear();
}
}
public void OnTriggerExit2D(Collider2D other)
{
// don't listen when component is disabled
if (!gameObject.GetComponent<WizardFirstQuestManager>().enabled || other.tag != "Player")
return;
if (gameObject.GetComponent<NpcMissionManager>().Mission != null && !gameObject.GetComponent<NpcMissionManager>().OpenInDefaultWay)
{
if (gameObject.GetComponent<NPC>().State == NPCStateEnum.Talking)
{
gameObject.GetComponent<NpcMissionManager>().Mission.BreakDialogueStep();
isDuringConversation = false;
gameObject.GetComponent<NPC>().State = NPCStateEnum.Walking;
}
// ...
}
}
public void HandleState()
{
switch (gameObject.GetComponent<NPC>().State)
{
case NPCStateEnum.Walking:
{
CheckDistance();
break;
}
case NPCStateEnum.Talking:
{
DoAction();
break;
}
case NPCStateEnum.Pending:
{
break;
}
case NPCStateEnum.Attacking:
{
break;
}
default:
{
Debug.Log("fancy text nie wiem co zrobic");
break;
}
}
}
public void DoAction()
{
if (approaching == true && isDuringConversation == false && gameObject.GetComponent<NpcMissionManager>().CanBeOpened)
{
isDuringConversation = true;
gameObject.GetComponent<NpcMissionManager>().Mission.StartDialogue();
}
}
public void GoToHomePosition()
{
agent.point = homePosition;
agent.FindPoint();
StartCoroutine(agent.FollowPath());
}
public void AfterMissionAccepting()
{
var wizardOnScene = GameObject.FindGameObjectWithTag("NPCCollection").transform.Find("Wizard");
if (wizardOnScene == null)
return;
//wizardOnScene.GetComponent<NPCFollowing>().isAfterAction = false;
wizardOnScene.GetComponent<WizardFirstQuestManager>().approaching = false;
//wizardOnScene.GetComponent<NPCFollowing>().waitingForMissionEffects = true;
wizardOnScene.GetComponent<NPC>().State = NPCStateEnum.Walking; // go home position
wizardOnScene.GetComponent<NpcMissionManager>().OpenInDefaultWay = true;
wizardOnScene.GetComponent<WizardFirstQuestManager>().MissionProggress = WizzardMissionStateEnum.WaitingForPeoggress;
PlayerPrefs.SetInt(gameObject.GetComponent<NPC>().name + ".FirstMission", (int)wizardOnScene.GetComponent<WizardFirstQuestManager>().MissionProggress);
}
// tylko pierwszy - drugi nie bedzie
public void AfterMeetingCondition()
{
var wizardOnScene = GameObject.FindGameObjectWithTag("NPCCollection").transform.Find("Wizard");
if (wizardOnScene == null)
return;
approaching = false;
//waitingForMissionEffects = false;
//isAfterAction = true;
wizardOnScene.GetComponent<WizardFirstQuestManager>().MissionProggress = WizzardMissionStateEnum.MainPlotIntroduction;
PlayerPrefs.SetInt(gameObject.GetComponent<NPC>().name + ".FirstMission", (int)wizardOnScene.GetComponent<WizardFirstQuestManager>().MissionProggress);
}
}