Commit 0fb0a658 authored by ElderLich's avatar ElderLich

Bug Fix: ATK/DEF Overflow Wraps to 0 Instead of Capping

When a monster’s ATK/DEF exceeds the display cap, the value could reset to 0. Fixed by normalizing battle values and clamping overflow to 99,999,999 (while still preserving unknown ? values), including UI and total-ATK calculations.
parent f5d3c158
...@@ -3220,8 +3220,8 @@ private bool IsEffectBoxRectInnerFill(RectTransform boxRt, Rect measuredNrm) ...@@ -3220,8 +3220,8 @@ private bool IsEffectBoxRectInnerFill(RectTransform boxRt, Rect measuredNrm)
line.SetActive(true); line.SetActive(true);
textATK.SetActive(true); textATK.SetActive(true);
textDEF.SetActive(true); textDEF.SetActive(true);
numATK.text = data.Attack == -2 ? "?" : data.Attack.ToString(); numATK.text = data.GetAttackString();
numDEF.text = data.Defense == -2 ? "?" : data.Defense.ToString(); numDEF.text = data.GetDefenseString();
linkCount.gameObject.SetActive(false); linkCount.gameObject.SetActive(false);
spellType.text = string.Empty; spellType.text = string.Empty;
cardDescription.GetComponent<RectTransform>().sizeDelta = new Vector2(590f, 160f); cardDescription.GetComponent<RectTransform>().sizeDelta = new Vector2(590f, 160f);
......
...@@ -202,10 +202,12 @@ namespace MDPro3 ...@@ -202,10 +202,12 @@ namespace MDPro3
manager.GetElement("Defense").SetActive(true); manager.GetElement("Defense").SetActive(true);
manager.GetElement("TextDefense").SetActive(true); manager.GetElement("TextDefense").SetActive(true);
manager.GetElement<Text>("TextDefense").text = data.Defense == -2 ? "?" : data.Defense.ToString(); var defense = Card.NormalizeBattleValue(data.Defense, true);
if (data.Defense > (origin.Defense < 0 ? 0 : origin.Defense)) var originDefense = Card.NormalizeBattleValue(origin.Defense, false);
manager.GetElement<Text>("TextDefense").text = Card.FormatBattleValue(defense);
if (Card.NormalizeBattleValue(defense, false) > originDefense)
manager.GetElement<Text>("TextDefense").color = upColor; manager.GetElement<Text>("TextDefense").color = upColor;
else if (data.Defense < origin.Defense) else if (Card.NormalizeBattleValue(defense, false) < originDefense)
manager.GetElement<Text>("TextDefense").color = downColor; manager.GetElement<Text>("TextDefense").color = downColor;
else else
manager.GetElement<Text>("TextDefense").color = equalColor; manager.GetElement<Text>("TextDefense").color = equalColor;
...@@ -238,10 +240,12 @@ namespace MDPro3 ...@@ -238,10 +240,12 @@ namespace MDPro3
} }
} }
manager.GetElement<Text>("TextAttack").text = data.Attack == -2 ? "?" : data.Attack.ToString(); var attack = Card.NormalizeBattleValue(data.Attack, true);
if (data.Attack > (origin.Attack < 0 ? 0 : origin.Attack)) var originAttack = Card.NormalizeBattleValue(origin.Attack, false);
manager.GetElement<Text>("TextAttack").text = Card.FormatBattleValue(attack);
if (Card.NormalizeBattleValue(attack, false) > originAttack)
manager.GetElement<Text>("TextAttack").color = upColor; manager.GetElement<Text>("TextAttack").color = upColor;
else if (data.Attack < origin.Attack) else if (Card.NormalizeBattleValue(attack, false) < originAttack)
manager.GetElement<Text>("TextAttack").color = downColor; manager.GetElement<Text>("TextAttack").color = downColor;
else else
manager.GetElement<Text>("TextAttack").color = equalColor; manager.GetElement<Text>("TextAttack").color = equalColor;
...@@ -527,4 +531,4 @@ namespace MDPro3 ...@@ -527,4 +531,4 @@ namespace MDPro3
} }
} }
} }
\ No newline at end of file
...@@ -423,10 +423,10 @@ namespace MDPro3 ...@@ -423,10 +423,10 @@ namespace MDPro3
else if (data.Id > 0) else if (data.Id > 0)
data.CloneTo(lastValidData); data.CloneTo(lastValidData);
if (d.Attack < 0) d.Attack = Card.NormalizeBattleValue(d.Attack, false);
d.Attack = 0; d.Defense = Card.NormalizeBattleValue(d.Defense, false);
if (d.Defense < 0) d.rAttack = Card.NormalizeBattleValue(d.rAttack, false);
d.Defense = 0; d.rDefense = Card.NormalizeBattleValue(d.rDefense, false);
if (d.Id != data.Id) if (d.Id != data.Id)
{ {
......
...@@ -10,6 +10,9 @@ namespace MDPro3.Duel.YGOSharp ...@@ -10,6 +10,9 @@ namespace MDPro3.Duel.YGOSharp
{ {
public class Card public class Card
{ {
public const int MAX_BATTLE_POWER_DISPLAY = 99_999_999;
public const int UNKNOWN_BATTLE_VALUE = -2;
public int Id; public int Id;
public int Ot; public int Ot;
public int Alias; public int Alias;
...@@ -229,15 +232,31 @@ namespace MDPro3.Duel.YGOSharp ...@@ -229,15 +232,31 @@ namespace MDPro3.Duel.YGOSharp
public string GetAttackString() public string GetAttackString()
{ {
return Attack == -2 ? "?" : Attack.ToString(); return FormatBattleValue(Attack);
} }
public string GetDefenseString() public string GetDefenseString()
{ {
return Defense == -2 ? "?" : Defense.ToString(); return FormatBattleValue(Defense);
}
public static int NormalizeBattleValue(int value, bool keepUnknown = true)
{
if (value == UNKNOWN_BATTLE_VALUE)
return keepUnknown ? UNKNOWN_BATTLE_VALUE : 0;
if (value < 0)
return MAX_BATTLE_POWER_DISPLAY;
if (value > MAX_BATTLE_POWER_DISPLAY)
return MAX_BATTLE_POWER_DISPLAY;
return value;
}
public static string FormatBattleValue(int value)
{
var normalized = NormalizeBattleValue(value, true);
return normalized == UNKNOWN_BATTLE_VALUE ? "?" : normalized.ToString();
} }
// Put this near other fields/helpers inside Card class:
private static readonly string PendulumSeparatorLine = new string('─', 14); private static readonly string PendulumSeparatorLine = new string('─', 14);
public string GetDescription(bool withSetName = false) public string GetDescription(bool withSetName = false)
...@@ -614,4 +633,4 @@ namespace MDPro3.Duel.YGOSharp ...@@ -614,4 +633,4 @@ namespace MDPro3.Duel.YGOSharp
#endregion #endregion
} }
} }
\ No newline at end of file
...@@ -1948,13 +1948,13 @@ namespace MDPro3.Servant ...@@ -1948,13 +1948,13 @@ namespace MDPro3.Servant
DuelBGManager.PlayGraveEffect(p, isIn); DuelBGManager.PlayGraveEffect(p, isIn);
} }
public int GetAllAtk(bool mySide) public long GetAllAtk(bool mySide)
{ {
int allAttack = 0; long allAttack = 0;
var monsters = GCS_GetLocationCards(mySide ? 0 : 1, (int)CardLocation.MonsterZone); var monsters = GCS_GetLocationCards(mySide ? 0 : 1, (int)CardLocation.MonsterZone);
foreach (var card in monsters) foreach (var card in monsters)
if ((card.p.position & (uint)CardPosition.FaceUpAttack) > 0) if ((card.p.position & (uint)CardPosition.FaceUpAttack) > 0)
allAttack += card.GetData().Attack; allAttack += Card.NormalizeBattleValue(card.GetData().Attack, false);
return allAttack; return allAttack;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment