DRHPS/code-csharp/en_US/PartyMemberSystem.cs
2025-04-08 11:31:35 +08:00

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;
}
}
}