236 lines
8.1 KiB
C#
236 lines
8.1 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
public class PartyMemberSystem : MonoBehaviour
|
|
{
|
|
[Header("-= Stats =-")]
|
|
public List<ActivePartyMember> ActivePartyMembers = new List<ActivePartyMember>();
|
|
|
|
[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<Susie_Follower>();
|
|
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;
|
|
}
|
|
}
|
|
}
|