using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class PartyMemberSystem : MonoBehaviour { [Header("-= Stats =-")] public List ActivePartyMembers = new List(); [Header("-= Default PartyMembers =-")] public PartyMember Default_NoelleDarkworld; public PartyMember Default_SusieDarkworld; public PartyMember Default_Susie; public PartyMember Default_Ralsei; public PartyMember Default_Kris; private static PartyMemberSystem instance; public static PartyMemberSystem Instance => instance; private void Awake() { if (instance != null && instance != this) { Object.Destroy(base.gameObject); return; } instance = this; Object.DontDestroyOnLoad(instance); } private void Start() { SceneManager.activeSceneChanged += SceneManager_activeSceneChanged; } public void AddPartyMember(PartyMember Member, int StartingHealth = -1) { if (Member != null) { GameObject gameObject = Object.Instantiate(Member.PartyMemberPrefab, base.transform); if (gameObject != null) { ActivePartyMember activePartyMember = new ActivePartyMember(); activePartyMember.PartyMemberDescription = Member; activePartyMember.PartyMemberTransform = gameObject.transform; if (StartingHealth == -1) { activePartyMember.CurrentHealth = Member.MaximumHealth; } else { activePartyMember.CurrentHealth = StartingHealth; } gameObject.name = Member.PartyMemberName + " " + SceneManager.GetActiveScene().name; ActivePartyMembers.Add(activePartyMember); int num = ActivePartyMembers.IndexOf(activePartyMember); Susie_Follower component = gameObject.transform.GetComponent(); if (component != null) { activePartyMember.PartyMemberFollowSettings = component; component.SusieAnimator.keepAnimatorStateOnDisable = true; component.delay = 0.5f + 0.625f * (float)num; activePartyMember.PartyMemberTransform.position = PlayerManager.Instance.transform.position; } else { Debug.LogWarning("Failed to set Party Member Walk Offset! ( No Susie_Follower in Prefab )"); } } else { Debug.LogWarning("Failed to create Party Member! ( No PartyMemberPrefab )"); } } else { Debug.LogWarning("Failed to create Party Member! ( No Member Provided )"); } } public void RemovePartyMember(PartyMember SpecificMember = null, bool RemoveSpecificIndex = false, int SpecificMemberIndex = 0) { if (RemoveSpecificIndex) { if (SpecificMemberIndex <= ActivePartyMembers.Count) { Object.Destroy(ActivePartyMembers[SpecificMemberIndex].PartyMemberTransform.gameObject); ActivePartyMembers.RemoveAt(SpecificMemberIndex); ResetAllMemberFollowerDelays(); } else { Debug.LogWarning("Failed to remove Party Member! ( SpecificedMemberIndex is greater than ActivePartyMembers list )"); } return; } ActivePartyMember activePartyMember = HasMemberInParty(SpecificMember); if (activePartyMember != null) { Object.Destroy(activePartyMember.PartyMemberTransform.gameObject); ActivePartyMembers.Remove(activePartyMember); ResetAllMemberFollowerDelays(); } else { Debug.LogWarning("Failed to remove Party Member! ( SpecificMember is not in ActivePartyMembers )"); } } public void AllPartyMemberPlayAnimation(string animationName) { foreach (ActivePartyMember activePartyMember in ActivePartyMembers) { activePartyMember.PartyMemberFollowSettings.SusieAnimator.Play(animationName); } } public void AllPartyMemberFaceDirection(Vector2 Direction) { foreach (ActivePartyMember activePartyMember in ActivePartyMembers) { activePartyMember.PartyMemberFollowSettings.RotateSusieToDirection(Direction); } } public void AllPartyMemberFacePosition(Vector2 targetPosition) { foreach (ActivePartyMember activePartyMember in ActivePartyMembers) { activePartyMember.PartyMemberFollowSettings.RotateSusieTowardsPosition(targetPosition); } } public void RemoveAllPartyMember() { for (int i = 0; i < ActivePartyMembers.Count; i++) { Object.Destroy(ActivePartyMembers[i].PartyMemberTransform.gameObject); } ActivePartyMembers.Clear(); ResetAllMemberFollowerDelays(); } public ActivePartyMember HasMemberInParty(PartyMember Member) { if (Member == null) { return null; } ActivePartyMember result = null; for (int i = 0; i < ActivePartyMembers.Count; i++) { if (ActivePartyMembers[i].PartyMemberDescription == Member) { result = ActivePartyMembers[i]; } } return result; } public void ResetAllMemberFollowerDelays() { for (int i = 0; i < ActivePartyMembers.Count; i++) { if (ActivePartyMembers[i].PartyMemberFollowSettings != null) { ActivePartyMembers[i].PartyMemberFollowSettings.positions.Clear(); ActivePartyMembers[i].PartyMemberFollowSettings.rotations.Clear(); ActivePartyMembers[i].PartyMemberFollowSettings.delay = 0.5f + 0.625f * (float)i; } } ResetAllMembersToPlayer(); } public void ResetAllMembersToPlayer() { if (ActivePartyMembers.Count <= 0) { return; } for (int i = 0; i < ActivePartyMembers.Count; i++) { if (ActivePartyMembers[i] != null && ActivePartyMembers[i].PartyMemberFollowSettings != null) { ActivePartyMembers[i].PartyMemberFollowSettings.positions.Clear(); ActivePartyMembers[i].PartyMemberFollowSettings.rotations.Clear(); ActivePartyMembers[i].PartyMemberTransform.position = PlayerManager.Instance.transform.position; } } } public Transform GetSpecificMemberTransform(PartyMember Member) { ActivePartyMember activePartyMember = HasMemberInParty(Member); if (activePartyMember != null) { return activePartyMember.PartyMemberTransform; } Debug.LogWarning("Failed to get Party Member Transform! ( Member not found in ActivePartyMembers )"); return null; } private void SceneManager_activeSceneChanged(Scene arg0, Scene arg1) { } public void SetAllPartyMembersActive(bool ActiveSelf) { foreach (ActivePartyMember activePartyMember in ActivePartyMembers) { activePartyMember.PartyMemberTransform.gameObject.SetActive(ActiveSelf); } } public void SetAllPartyMembersFollowing(bool Following) { foreach (ActivePartyMember activePartyMember in ActivePartyMembers) { activePartyMember.PartyMemberFollowSettings.FollowingEnabled = Following; } } public void SetAllPartyMemberStates(Susie_Follower.MemberFollowerStates State) { foreach (ActivePartyMember activePartyMember in ActivePartyMembers) { activePartyMember.PartyMemberFollowSettings.currentState = State; } } }