From e6cb36788598bd52a9ab9ffeed319f68509fe366 Mon Sep 17 00:00:00 2001 From: tibz Date: Fri, 25 Sep 2026 02:56:51 -0500 Subject: [PATCH] more changes for unit refactor --- Johnmagotchi/GameContent/Logic/BattleLogic.cs | 27 ++++++++++--------- .../GameContent/Objects/Maps/BattleMap.cs | 2 +- .../Objects/Maps/MapMovementNode.cs | 16 ++++++----- .../GameContent/Objects/UI/UnitDisplay.cs | 9 ++++--- .../BattleMapScreen/BattleMapScreen.cs | 27 ++++++++++--------- 5 files changed, 43 insertions(+), 38 deletions(-) diff --git a/Johnmagotchi/GameContent/Logic/BattleLogic.cs b/Johnmagotchi/GameContent/Logic/BattleLogic.cs index 8a59565..7c28696 100644 --- a/Johnmagotchi/GameContent/Logic/BattleLogic.cs +++ b/Johnmagotchi/GameContent/Logic/BattleLogic.cs @@ -1,4 +1,5 @@ -using Johnmagotchi.GameContent.Objects.Units.BattleObjects; +using Johnmagotchi.GameContent.Objects.Units; +using Johnmagotchi.GameContent.Objects.Units.BattleObjects; using Johnmagotchi.GameContent.Units; using System; using System.Collections.Generic; @@ -15,7 +16,7 @@ namespace Johnmagotchi.GameContent.Logic { private static double CriticalMultiplier = 1.5; public static Random Random = new Random(); - public static BattleResults RunBattle(ref UnitObject Attacker, ref UnitObject Defender, AttackObj attack, AttackObj counterAttack) { + public static BattleResults RunBattle(ref Unit Attacker, ref Unit Defender, AttackObj attack, AttackObj counterAttack) { // these are debugs, should be parsed from attack + unit combos bool IsCounterAttackOccuring = true; @@ -51,7 +52,7 @@ namespace Johnmagotchi.GameContent.Logic // this is each step public static void HandleAttackPhase( - ref UnitObject Attacker, ref UnitObject Defender, AttackObj attack, + ref Unit Attacker, ref Unit Defender, AttackObj attack, ref BattleResults results, bool isCounter) { int hitcount = attack.BaseHitCount; // anything that adjusts how many times an attack happens PER PHASE should be adjusted here @@ -59,7 +60,7 @@ namespace Johnmagotchi.GameContent.Logic for (int i = 0; i < hitcount; i++) { int hitRoll = BattleLogic.Random.Next(100) + 1; // random int 1 - 100 - int hitThreshold = attack.BaseAccuracy + Attacker.stats.Speed - Defender.stats.Speed; + int hitThreshold = attack.BaseAccuracy + Attacker.stats.baseStats.Speed - Defender.stats.baseStats.Speed; // this should be adjusted, in FE games its usally something like...... // ATTACKER = Hit + (Skill × 2) + (Luck / 2) + (Support bonus)+(Weapon triangle advantage/ disadvantage) +(S level bonus) @@ -77,19 +78,19 @@ namespace Johnmagotchi.GameContent.Logic else if (hitRoll >= critThreshold) //Handle Crits { - if (Defender.currentStatus.CurrentShieldCount > 1) Defender.currentStatus.CurrentShieldCount--; // as is, crits ignore shields but should still tick a shield down - if (Defender.currentStatus.CurrentShieldCount < 0) Defender.currentStatus.CurrentShieldCount = 0; + if (Defender.stats.status.CurrentShieldCount > 1) Defender.stats.status.CurrentShieldCount--; // as is, crits ignore shields but should still tick a shield down + if (Defender.stats.status.CurrentShieldCount < 0) Defender.stats.status.CurrentShieldCount = 0; int BaseDamage = CalculateDamage(Attacker,Defender,attack); int TotalCritDamage = (int) Math.Ceiling (BaseDamage * CriticalMultiplier); //apply Damage to defending unit, then add to result report - Defender.currentStatus.CurrentHealth -= TotalCritDamage; + Defender.stats.status.CurrentHealth -= TotalCritDamage; results.addResult(BattleResults.resultType.CRITICAL, TotalCritDamage, isCounter); } - else if (Defender.currentStatus.CurrentShieldCount > 1) // Shielded + else if (Defender.stats.status.CurrentShieldCount > 1) // Shielded { - Defender.currentStatus.CurrentShieldCount--; + Defender.stats.status.CurrentShieldCount--; results.addResult(BattleResults.resultType.SHIELDED,1, isCounter); // 1 siginfies 1 shield lost } else // normal attack @@ -97,21 +98,21 @@ namespace Johnmagotchi.GameContent.Logic int BaseDamage = CalculateDamage(Attacker, Defender, attack); //Apply damage + report to animation handler - Defender.currentStatus.CurrentHealth -= BaseDamage; + Defender.stats.status.CurrentHealth -= BaseDamage; results.addResult(BattleResults.resultType.ATTACK, BaseDamage, isCounter); } } return; } - private static int CalculateDamage( UnitObject Attacker, UnitObject Defender, AttackObj attack) + private static int CalculateDamage( Unit Attacker, Unit Defender, AttackObj attack) { int damage = 0; damage += attack.BaseDamage; - damage += Attacker.stats.Attack; + damage += Attacker.stats.baseStats.Attack; - damage -= Defender.stats.Defense; + damage -= Defender.stats.baseStats.Defense; if (damage < 0) damage = 0; diff --git a/Johnmagotchi/GameContent/Objects/Maps/BattleMap.cs b/Johnmagotchi/GameContent/Objects/Maps/BattleMap.cs index 476e8f8..dc69345 100644 --- a/Johnmagotchi/GameContent/Objects/Maps/BattleMap.cs +++ b/Johnmagotchi/GameContent/Objects/Maps/BattleMap.cs @@ -475,7 +475,7 @@ namespace Johnmagotchi.GameContent.Objects return null; } - public void moveUnit(UnitObject unitcopy, int x, int y) + public void moveUnit(Unit unitcopy, int x, int y) { foreach (Unit Unit in playerUnits) { diff --git a/Johnmagotchi/GameContent/Objects/Maps/MapMovementNode.cs b/Johnmagotchi/GameContent/Objects/Maps/MapMovementNode.cs index 53ddf2d..de3d5aa 100644 --- a/Johnmagotchi/GameContent/Objects/Maps/MapMovementNode.cs +++ b/Johnmagotchi/GameContent/Objects/Maps/MapMovementNode.cs @@ -21,7 +21,7 @@ namespace Johnmagotchi.GameContent.Objects.Maps public int movesRemaining; public int x; public int y; - public MapMovementNode(UnitObject selectedUnit, BattleMap currentMap, int moveRemaining, int x, int y) { + public MapMovementNode(Unit selectedUnit, BattleMap currentMap, int moveRemaining, int x, int y) { this.selectedUnit = selectedUnit; this.currentMap = currentMap; @@ -145,8 +145,9 @@ namespace Johnmagotchi.GameContent.Objects.Maps Unit targetUnit = currentMap.getUnitAtLocation(x, y); if (targetUnit != null) { if ( - (selectedUnit.team == Unit.UnitTeam.PLAYER && targetUnit.stats.status.team == Units.BattleObjects.UnitCurrentStatus.UnitTeam.ENEMY) || - (selectedUnit.team == Unit.UnitTeam.ENEMY && (targetUnit.team == UnitObject.UnitTeam.PLAYER || targetUnit.team == UnitObject.UnitTeam.NPC)) + (selectedUnit.stats.status.team == Units.BattleObjects.UnitCurrentStatus.UnitTeam.PLAYER && targetUnit.stats.status.team == Units.BattleObjects.UnitCurrentStatus.UnitTeam.ENEMY) || + (selectedUnit.stats.status.team == Units.BattleObjects.UnitCurrentStatus.UnitTeam.ENEMY && (targetUnit.stats.status.team == Units.BattleObjects.UnitCurrentStatus.UnitTeam.PLAYER || + targetUnit.stats.status.team == Units.BattleObjects.UnitCurrentStatus.UnitTeam.NPC)) ) { return 0; @@ -158,7 +159,7 @@ namespace Johnmagotchi.GameContent.Objects.Maps // MovementCostTable.getMoveCost(selectedUnit.stats.movementType, destTile.Type); // note that the return value MUST be <= moves remaining, or else we risk infinite recursion - return movesRemaining - MovementCostTable.getMoveCost(selectedUnit.stats.movementType, destTile.Type); + return movesRemaining - MovementCostTable.getMoveCost(selectedUnit.stats.baseStats.movementType, destTile.Type); } private List> RemoveDuplicates( List> oldList) @@ -190,9 +191,10 @@ namespace Johnmagotchi.GameContent.Objects.Maps private void addAttackRangesToList( ref List> list) { - for (int i = selectedUnit.DirectAttackRangeMin; i <= selectedUnit.DirectAttackRangeMax; i++) { - getCircleRange(ref list, i); - } + //TODO -- add attack ranges based on available attacks + //for (int i = selectedUnit.stats.baseStatsDirectAttackRangeMin; i <= selectedUnit.DirectAttackRangeMax; i++) { + // getCircleRange(ref list, i); + //} } diff --git a/Johnmagotchi/GameContent/Objects/UI/UnitDisplay.cs b/Johnmagotchi/GameContent/Objects/UI/UnitDisplay.cs index d76187e..bc3f049 100644 --- a/Johnmagotchi/GameContent/Objects/UI/UnitDisplay.cs +++ b/Johnmagotchi/GameContent/Objects/UI/UnitDisplay.cs @@ -1,4 +1,5 @@ using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Objects.Units; using Johnmagotchi.GameContent.Units; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; @@ -21,7 +22,7 @@ namespace Johnmagotchi.GameContent.Objects.UI Texture2D NpcDisplayTexture; protected SpriteFont kemco; protected SpriteFont pixsplit; - UnitObject HighlightedUnit; + Unit HighlightedUnit; Boolean showDisplay; @@ -44,7 +45,7 @@ namespace Johnmagotchi.GameContent.Objects.UI } - public void Update(UnitObject unit) { + public void Update(Unit unit) { if (unit == null) { showDisplay = false; return; @@ -62,7 +63,7 @@ namespace Johnmagotchi.GameContent.Objects.UI if (HighlightedUnit == null) { return; } Texture2D texture = UnitDisplayTexture; - if (HighlightedUnit.team == UnitObject.UnitTeam.ENEMY) + if (HighlightedUnit.stats.status.team == Unit.UnitTeam.ENEMY) { texture = EnemyDisplayTexture; } @@ -95,7 +96,7 @@ namespace Johnmagotchi.GameContent.Objects.UI DrawText(posX, posY, HighlightedUnit.playerClassEnum.ToString()); posX += (int)Math.Round(.05 * DISPLAY_WIDTH); posY += (15 * ScreenManager.BASE_ZOOM_LEVEL); - string DisplayString = HighlightedUnit.currentStatus.CurrentHealth + " HP - " + HighlightedUnit.stats.MaxHealth + " MAX"; + string DisplayString = HighlightedUnit.stats.status.CurrentHealth + " HP - " + HighlightedUnit.stats.baseStats.MaxHealth + " MAX"; DrawText(posX, posY, DisplayString); } diff --git a/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattleMapScreen.cs b/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattleMapScreen.cs index e83861b..44bdda7 100644 --- a/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattleMapScreen.cs +++ b/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattleMapScreen.cs @@ -2,6 +2,7 @@ using Johnmagotchi.Core.tools; using Johnmagotchi.GameContent.Logic; using Johnmagotchi.GameContent.Objects; using Johnmagotchi.GameContent.Objects.Maps; +using Johnmagotchi.GameContent.Objects.Units; using Johnmagotchi.GameContent.Screens.Menu.BattleMap; using Johnmagotchi.GameContent.Units; using Johnmagotchi.Screen.BattleMapScreens; @@ -20,8 +21,8 @@ namespace Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen END_ACTION, } - UnitObject selectedToMoveUnit; - UnitObject attackedUnit; + Unit selectedToMoveUnit; + Unit attackedUnit; private Tuple originalLocation; private List> validMoves; private List> validAttacks; @@ -59,11 +60,11 @@ namespace Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen TibzLog.Debug("Select Pressed"); - UnitObject newSelectedUnit = CurrentMap.getUnitAtLocation(cursorIndexX, cursorIndexY); - TibzLog.Debug(newSelectedUnit.UnitLoadout.AvailableAttacks); - if (newSelectedUnit != null && newSelectedUnit.isTurnOver == false && selectedToMoveUnit == null) + Unit newSelectedUnit = CurrentMap.getUnitAtLocation(cursorIndexX, cursorIndexY); + // TibzLog.Debug( newSelectedUnit.stats.loadout.AvailableAttacks); + if (newSelectedUnit != null && newSelectedUnit.stats.status.isTurnOver == false && selectedToMoveUnit == null) { - selectedToMoveUnit = newSelectedUnit; + // selectedToMoveUnit this.originalLocation = new Tuple(cursorIndexX, cursorIndexY); ShowAllMoveHighlights(); @@ -93,7 +94,7 @@ namespace Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen ShowDirectAttackHighlights(); // This menu directly calls: //AfterMoveWait(), AfterMoveAttack(), AfterMoveWait() - TibzLog.Debug(selectedToMoveUnit.UnitLoadout.AvailableAttacks); + TibzLog.Debug(selectedToMoveUnit.stats.loadout.AvailableAttacks); screenManager.addScreen( new AfterMovementMenu( this, @@ -166,29 +167,29 @@ namespace Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen // throw new NotImplementedException(); } - public List> GetValidMoveCoordinates(UnitObject unit, Tuple coords) + public List> GetValidMoveCoordinates(Unit unit, Tuple coords) { List> validTiles = new List>(); int x = coords.Item1; int y = coords.Item2; - int range = unit.stats.Movement; + int range = unit.stats.baseStats.Movement; // tree traversal time TibzLog.Debug(" - BM screen - "); - TibzLog.Debug(unit.stats.movementType); + TibzLog.Debug(unit.stats.baseStats.movementType); MapMovementNode rootNode = new MapMovementNode(unit, CurrentMap, range, x, y); rootNode.GetMoveLocations(MapMovementNode.ParentNodeLocation.ROOT, ref validTiles); return validTiles; } - public List> GetValidAttackHighlights(UnitObject unit, Tuple coords) + public List> GetValidAttackHighlights(Unit unit, Tuple coords) { List> validTiles = new List>(); int x = coords.Item1; int y = coords.Item2; - int range = unit.stats.Movement; + int range = unit.stats.baseStats.Movement; MapMovementNode rootNode = new MapMovementNode(unit, CurrentMap, range, x, y); rootNode.getDirectAttackLocations(MapMovementNode.ParentNodeLocation.ROOT, ref validTiles); @@ -229,7 +230,7 @@ namespace Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen private void finishMovement() { - this.selectedToMoveUnit.isTurnOver = true; + this.selectedToMoveUnit.stats.status.isTurnOver = true; this.selectedToMoveUnit = null; }