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

240 lines
8.8 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BattleAttackWindow : MonoBehaviour
{
[SerializeField]
private List<RectTransform> AttackBars = new List<RectTransform>();
[SerializeField]
private List<BattleAttackBar> AttackBarComponents = new List<BattleAttackBar>();
[SerializeField]
private GameObject AttackBarHolder;
[SerializeField]
private bool AttackBarsActive;
private int FinishedAttackBars;
private void OnEnable()
{
AttackBars.Clear();
AttackBarComponents.Clear();
BattleAttackBar[] componentsInChildren = AttackBarHolder.GetComponentsInChildren<BattleAttackBar>();
foreach (BattleAttackBar battleAttackBar in componentsInChildren)
{
if (battleAttackBar.transform.parent == AttackBarHolder.transform)
{
AttackBars.Add((RectTransform)battleAttackBar.transform);
battleAttackBar.FadeAttackBar(5f, Color.white);
AttackBarComponents.Add(battleAttackBar.GetComponentInChildren<BattleAttackBar>());
}
}
}
private void Update()
{
if (AttackBarsActive && Input.GetKeyDown(PlayerInput.Instance.Key_Confirm) && !GonerMenu.Instance.gonerMenuWasOpen && !GonerMenu.Instance.GonerMenuOpen)
{
ProcessAttackInput();
}
if (AttackBarsActive)
{
foreach (BattleAttackBar closestBar in GetClosestBars())
{
if (CheckBarMissed(closestBar))
{
closestBar.HasSetupPosition = false;
closestBar.PlayPartyMemberAttackAnimation();
BattleSystem.PlayBattleSoundEffect(BattleSystem.Instance.SFX_fight_slash);
StartCoroutine(DamageEnemyDelay(closestBar.TargetActiveEnemy, 0, closestBar.TargetPartyMember, closestBar));
}
}
}
if (FinishedAttackBars == AttackBarComponents.Count)
{
ClearAttackBars();
BattleSystem.Instance.CurrentBattlePlayerTurnState = BattleSystem.BattlePlayerTurnState.FINISHED;
}
}
private void ProcessAttackInput()
{
foreach (BattleAttackBar closestBar in GetClosestBars())
{
if (closestBar.AttackBar.anchoredPosition.x <= -230f)
{
float num = closestBar.CalculateAccuracy();
int damage = Mathf.CeilToInt(closestBar.CalculateDamage(closestBar.TargetPartyMember.PartyMemberInBattle.ATK, num, closestBar.TargetActiveEnemy.EnemyInBattle.DF));
closestBar.HasSetupPosition = false;
closestBar.PlayPartyMemberAttackAnimation();
BattleSystem.Instance.AddTP(Mathf.CeilToInt(num / 10f));
BattleSystem.PlayBattleSoundEffect(BattleSystem.Instance.SFX_fight_slash);
if (closestBar.IsCurrentlyCritical)
{
BattleSystem.PlayBattleSoundEffect(BattleSystem.Instance.SFX_fight_critical, 0.5f);
}
StartCoroutine(DamageEnemyDelay(closestBar.TargetActiveEnemy, damage, closestBar.TargetPartyMember, closestBar));
}
}
}
private bool CheckBarMissed(BattleAttackBar bar)
{
if (bar.AttackBar.anchoredPosition.x <= -500f && bar.HasSetupPosition)
{
return true;
}
return false;
}
private IEnumerator DamageEnemyDelay(BattleActiveEnemy target, int Damage, BattlePartyMember dealer, BattleAttackBar targetBar)
{
yield return new WaitForSeconds(0.35f);
GameObject gameObject = Object.Instantiate(BattleSystem.Instance.BattlePrefab_Effect_PartyMemberAttack);
Object.Destroy(gameObject, 0.5f);
gameObject.GetComponent<Animator>().Play(dealer.PartyMemberInBattle.BattleEffect_AnimationName);
if (target != null && target.EnemyInBattle_Gameobject != null)
{
gameObject.transform.position = target.EnemyInBattle_Gameobject.transform.position + new Vector3(0f, 0.75f, 0f);
}
targetBar.FadeAttackBar(3f, new Color(1f, 1f, 1f, 0f));
BattleSystem.Instance.DamageEnemy(target, Damage, dealer);
yield return new WaitForSeconds(0.5f);
yield return new WaitForSeconds(1f);
FinishedAttackBars++;
}
private List<BattleAttackBar> GetClosestBars()
{
List<BattleAttackBar> list = new List<BattleAttackBar>();
float num = float.MaxValue;
foreach (BattleAttackBar attackBarComponent in AttackBarComponents)
{
if (attackBarComponent.HasSetupPosition)
{
float distanceToCritical = attackBarComponent.GetDistanceToCritical();
if (distanceToCritical < num)
{
num = distanceToCritical;
list.Clear();
list.Add(attackBarComponent);
}
else if (Mathf.Approximately(distanceToCritical, num))
{
list.Add(attackBarComponent);
}
}
}
return list;
}
public void ClearAttackBars()
{
foreach (RectTransform attackBar in AttackBars)
{
Object.Destroy(attackBar.gameObject);
}
AttackBars.Clear();
AttackBarComponents.Clear();
FinishedAttackBars = 0;
AttackBarsActive = false;
base.gameObject.SetActive(value: false);
}
public void SetupAttackBarPositions()
{
switch (Random.Range(0, 4))
{
case 0:
if (AttackBars.Count > 0)
{
if (AttackBars.Count >= 1)
{
AttackBarComponents[0].SetNewBarPosition(160f);
}
if (AttackBars.Count >= 2)
{
AttackBarComponents[1].SetNewBarPosition(30f);
}
if (AttackBars.Count >= 3)
{
AttackBarComponents[2].SetNewBarPosition(30f);
}
}
break;
case 1:
if (AttackBars.Count > 0)
{
if (AttackBars.Count >= 1)
{
AttackBarComponents[0].SetNewBarPosition(30f);
}
if (AttackBars.Count >= 2)
{
AttackBarComponents[1].SetNewBarPosition(160f);
}
if (AttackBars.Count >= 3)
{
AttackBarComponents[2].SetNewBarPosition(220f);
}
}
break;
case 2:
if (AttackBars.Count > 0)
{
if (AttackBars.Count >= 1)
{
AttackBarComponents[0].SetNewBarPosition(30f);
}
if (AttackBars.Count >= 2)
{
AttackBarComponents[1].SetNewBarPosition(30f);
}
if (AttackBars.Count >= 3)
{
AttackBarComponents[2].SetNewBarPosition(160f);
}
}
break;
case 3:
if (AttackBars.Count > 0)
{
if (AttackBars.Count >= 1)
{
AttackBarComponents[0].SetNewBarPosition(160f);
}
if (AttackBars.Count >= 2)
{
AttackBarComponents[1].SetNewBarPosition(160f);
}
if (AttackBars.Count >= 3)
{
AttackBarComponents[2].SetNewBarPosition(30f);
}
}
break;
case 4:
if (AttackBars.Count > 0)
{
if (AttackBars.Count >= 1)
{
AttackBarComponents[0].SetNewBarPosition(30f);
}
if (AttackBars.Count >= 2)
{
AttackBarComponents[1].SetNewBarPosition(160f);
}
if (AttackBars.Count >= 3)
{
AttackBarComponents[2].SetNewBarPosition(30f);
}
}
break;
}
AttackBarsActive = true;
}
}