2025-05-13 19:22:01 +08:00

194 lines
5.0 KiB
C#

using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using Godot;
using Godot.Bridge;
using Godot.NativeInterop;
[ScriptPath("res://Scripts/UI/PartyHUD.cs")]
public partial class PartyHUD : NinePatchRect
{
[Export(PropertyHint.None, "")]
private int id;
[Export(PropertyHint.None, "")]
public RichTextLabel name;
[Export(PropertyHint.None, "")]
public RichTextLabel hp;
[Export(PropertyHint.None, "")]
public RichTextLabel diag;
[Export(PropertyHint.None, "")]
public RichTextLabel smallHP;
[Export(PropertyHint.None, "")]
public Sprite2D hpBar;
[Export(PropertyHint.None, "")]
public Sprite2D icon;
[Export(PropertyHint.None, "")]
public Sprite2D smallHpBar;
[Export(PropertyHint.None, "")]
public Node2D battleStuff;
[Export(PropertyHint.None, "")]
public Node2D big;
[Export(PropertyHint.None, "")]
public Node2D small;
[Export(PropertyHint.None, "")]
private Sprite2D[] battleButtons;
public static readonly int[][] pPos = new int[3][]
{
new int[5] { 110, 0, 0, 0, 0 },
new int[5] { 35, 179, 0, 0, 0 },
new int[5] { 1, 110, 219, 0, 0 }
};
private const int sizeBig = 103;
private const int sizeSmall = 54;
private static readonly Texture2D[] actButtons = new Texture2D[2]
{
GD.Load<Texture2D>("res://Sprites/Menus/Menu Sprites/DWAct.tres"),
GD.Load<Texture2D>("res://Sprites/Menus/Menu Sprites/DWMagic.tres")
};
public float mesTime;
public override void _Ready()
{
big.Visible = true;
small.Visible = false;
}
public void Update()
{
if (id < SaveFile.current.activeParty.Count)
{
battleButtons[1].Texture = actButtons[Party.party[SaveFile.current.activeParty[id]].doMagicMenu ? 1u : 0u];
icon.Texture = GD.Load<Texture2D>("res://Sprites/Menus/Menu Sprites/" + Party.party[SaveFile.current.activeParty[id]].id.ToString() + "Icon.tres");
name.Text = Party.party[SaveFile.current.activeParty[id]].name;
base.SelfModulate = Main.instance.partyColors[SaveFile.current.activeParty[id]];
hpBar.SelfModulate = base.SelfModulate;
battleStuff.GetChild<Control>(0).Modulate = base.SelfModulate;
hpBar.Scale = new Vector2(Mathf.Clamp((float)Party.party[SaveFile.current.activeParty[id]].HP / (float)Party.party[SaveFile.current.activeParty[id]].MAXHP, 0f, 1f), 1f);
hp.Text = "[center]" + ((Party.party[SaveFile.current.activeParty[id]].HP <= 0) ? "[color=red]" : "") + Party.party[SaveFile.current.activeParty[id]].HP + "/" + Party.party[SaveFile.current.activeParty[id]].MAXHP;
smallHP.Text = hp.Text;
smallHpBar.Scale = hpBar.Scale;
smallHpBar.SelfModulate = hpBar.SelfModulate;
bool flag = SaveFile.current.activeParty.Count > 3;
diag.Size = new Vector2(flag ? 60 : 110, flag ? 16 : 8);
diag.AutowrapMode = (TextServer.AutowrapMode)(flag ? 3 : 0);
}
}
public override void _Process(double delta)
{
if (mesTime > 0f)
{
diag.Visible = true;
mesTime -= Main.deltaTime;
if (mesTime < 100f)
{
diag.SelfModulate = Main.colorClear.Lerp(Main.colorWhite, mesTime / 100f);
}
else
{
diag.SelfModulate = Main.colorWhite;
}
}
else
{
diag.Visible = false;
}
if (SaveFile.current.activeParty.Count > 3)
{
UpdatePos();
}
if (BattleDR.current != null && BattleDR.current.spareAble && (BattleDR.current.blockedCommands == null || !BattleDR.current.blockedCommands.Contains(3)))
{
battleButtons[3].SelfModulate = Main.colorWhite.Lerp(DWMenu.instance.buttonColors[2], Mathf.Abs(Mathf.Sin(Mathf.DegToRad((float)Time.GetTicksMsec() * 0.2f))));
}
icon.Visible = DWMenu.instance.selectedParty != id;
}
private void UpdatePos()
{
if (BattleDR.current?.currentActor == id)
{
if (!big.Visible)
{
big.Visible = true;
}
if (small.Visible)
{
small.Visible = false;
}
base.Size = new Vector2(103f, base.Size.Y);
}
else
{
if (big.Visible)
{
big.Visible = false;
}
if (!small.Visible)
{
small.Visible = true;
}
base.Size = new Vector2(54f, base.Size.Y);
}
if (id > 0)
{
base.Position = new Vector2(GetPreviousSize(), base.Position.Y);
}
else if (SaveFile.current.activeParty.Count >= 4 && (BattleDR.current == null || BattleDR.DoingAction()))
{
base.Position = new Vector2((SaveFile.current.activeParty.Count == 5) ? 24 : 18, base.Position.Y);
}
else
{
base.Position = new Vector2(1f, base.Position.Y);
}
}
private float GetPreviousSize()
{
float num = (DWMenu.instance.partyHUDs[id - 1].big.Visible ? 103 : 54);
if (SaveFile.current.activeParty.Count == 4)
{
num += (float)((BattleDR.current == null || BattleDR.DoingAction()) ? 18 : 16);
if (id >= 2)
{
num += 1f;
}
}
return DWMenu.instance.partyHUDs[id - 1].Position.X + num;
}
public void UpdateOpt(int id)
{
for (int i = 0; i < battleButtons.Length; i++)
{
BattleDR current = BattleDR.current;
if (current != null && current.blockedCommands?.Contains(i) == true)
{
battleButtons[i].SelfModulate = ((id == i) ? Main.colorGray : Main.colorDark);
}
else
{
battleButtons[i].SelfModulate = DWMenu.instance.buttonColors[(id == i) ? 1 : 2];
}
}
}
}