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)
line.SetActive(true);
textATK.SetActive(true);
textDEF.SetActive(true);
numATK.text = data.Attack == -2 ? "?" : data.Attack.ToString();
numDEF.text = data.Defense == -2 ? "?" : data.Defense.ToString();
numATK.text = data.GetAttackString();
numDEF.text = data.GetDefenseString();
linkCount.gameObject.SetActive(false);
spellType.text = string.Empty;
cardDescription.GetComponent<RectTransform>().sizeDelta = new Vector2(590f, 160f);
......
......@@ -202,10 +202,12 @@ namespace MDPro3
manager.GetElement("Defense").SetActive(true);
manager.GetElement("TextDefense").SetActive(true);
manager.GetElement<Text>("TextDefense").text = data.Defense == -2 ? "?" : data.Defense.ToString();
if (data.Defense > (origin.Defense < 0 ? 0 : origin.Defense))
var defense = Card.NormalizeBattleValue(data.Defense, true);
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;
else if (data.Defense < origin.Defense)
else if (Card.NormalizeBattleValue(defense, false) < originDefense)
manager.GetElement<Text>("TextDefense").color = downColor;
else
manager.GetElement<Text>("TextDefense").color = equalColor;
......@@ -238,10 +240,12 @@ namespace MDPro3
}
}
manager.GetElement<Text>("TextAttack").text = data.Attack == -2 ? "?" : data.Attack.ToString();
if (data.Attack > (origin.Attack < 0 ? 0 : origin.Attack))
var attack = Card.NormalizeBattleValue(data.Attack, true);
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;
else if (data.Attack < origin.Attack)
else if (Card.NormalizeBattleValue(attack, false) < originAttack)
manager.GetElement<Text>("TextAttack").color = downColor;
else
manager.GetElement<Text>("TextAttack").color = equalColor;
......
......@@ -423,10 +423,10 @@ namespace MDPro3
else if (data.Id > 0)
data.CloneTo(lastValidData);
if (d.Attack < 0)
d.Attack = 0;
if (d.Defense < 0)
d.Defense = 0;
d.Attack = Card.NormalizeBattleValue(d.Attack, false);
d.Defense = Card.NormalizeBattleValue(d.Defense, false);
d.rAttack = Card.NormalizeBattleValue(d.rAttack, false);
d.rDefense = Card.NormalizeBattleValue(d.rDefense, false);
if (d.Id != data.Id)
{
......
......@@ -10,6 +10,9 @@ namespace MDPro3.Duel.YGOSharp
{
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 Ot;
public int Alias;
......@@ -229,15 +232,31 @@ namespace MDPro3.Duel.YGOSharp
public string GetAttackString()
{
return Attack == -2 ? "?" : Attack.ToString();
return FormatBattleValue(Attack);
}
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);
public string GetDescription(bool withSetName = false)
......
......@@ -1948,13 +1948,13 @@ namespace MDPro3.Servant
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);
foreach (var card in monsters)
if ((card.p.position & (uint)CardPosition.FaceUpAttack) > 0)
allAttack += card.GetData().Attack;
allAttack += Card.NormalizeBattleValue(card.GetData().Attack, false);
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