more changes for unit refactor

This commit is contained in:
tibz 2026-09-25 02:56:51 -05:00
parent b745fb9443
commit e6cb367885
5 changed files with 43 additions and 38 deletions

View File

@ -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 Johnmagotchi.GameContent.Units;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -15,7 +16,7 @@ namespace Johnmagotchi.GameContent.Logic
{ {
private static double CriticalMultiplier = 1.5; private static double CriticalMultiplier = 1.5;
public static Random Random = new Random(); 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 // these are debugs, should be parsed from attack + unit combos
bool IsCounterAttackOccuring = true; bool IsCounterAttackOccuring = true;
@ -51,7 +52,7 @@ namespace Johnmagotchi.GameContent.Logic
// this is each step // this is each step
public static void HandleAttackPhase( 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) ref BattleResults results, bool isCounter)
{ {
int hitcount = attack.BaseHitCount; // anything that adjusts how many times an attack happens PER PHASE should be adjusted here 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++) { for (int i = 0; i < hitcount; i++) {
int hitRoll = BattleLogic.Random.Next(100) + 1; // random int 1 - 100 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...... // 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) // 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 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.stats.status.CurrentShieldCount > 1) Defender.stats.status.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 < 0) Defender.stats.status.CurrentShieldCount = 0;
int BaseDamage = CalculateDamage(Attacker,Defender,attack); int BaseDamage = CalculateDamage(Attacker,Defender,attack);
int TotalCritDamage = (int) Math.Ceiling (BaseDamage * CriticalMultiplier); int TotalCritDamage = (int) Math.Ceiling (BaseDamage * CriticalMultiplier);
//apply Damage to defending unit, then add to result report //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); 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 results.addResult(BattleResults.resultType.SHIELDED,1, isCounter); // 1 siginfies 1 shield lost
} }
else // normal attack else // normal attack
@ -97,21 +98,21 @@ namespace Johnmagotchi.GameContent.Logic
int BaseDamage = CalculateDamage(Attacker, Defender, attack); int BaseDamage = CalculateDamage(Attacker, Defender, attack);
//Apply damage + report to animation handler //Apply damage + report to animation handler
Defender.currentStatus.CurrentHealth -= BaseDamage; Defender.stats.status.CurrentHealth -= BaseDamage;
results.addResult(BattleResults.resultType.ATTACK, BaseDamage, isCounter); results.addResult(BattleResults.resultType.ATTACK, BaseDamage, isCounter);
} }
} }
return; return;
} }
private static int CalculateDamage( UnitObject Attacker, UnitObject Defender, AttackObj attack) private static int CalculateDamage( Unit Attacker, Unit Defender, AttackObj attack)
{ {
int damage = 0; int damage = 0;
damage += attack.BaseDamage; 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; if (damage < 0) damage = 0;

View File

@ -475,7 +475,7 @@ namespace Johnmagotchi.GameContent.Objects
return null; 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) foreach (Unit Unit in playerUnits)
{ {

View File

@ -21,7 +21,7 @@ namespace Johnmagotchi.GameContent.Objects.Maps
public int movesRemaining; public int movesRemaining;
public int x; public int x;
public int y; 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.selectedUnit = selectedUnit;
this.currentMap = currentMap; this.currentMap = currentMap;
@ -145,8 +145,9 @@ namespace Johnmagotchi.GameContent.Objects.Maps
Unit targetUnit = currentMap.getUnitAtLocation(x, y); Unit targetUnit = currentMap.getUnitAtLocation(x, y);
if (targetUnit != null) { if (targetUnit != null) {
if ( if (
(selectedUnit.team == Unit.UnitTeam.PLAYER && targetUnit.stats.status.team == Units.BattleObjects.UnitCurrentStatus.UnitTeam.ENEMY) || (selectedUnit.stats.status.team == Units.BattleObjects.UnitCurrentStatus.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.ENEMY && (targetUnit.stats.status.team == Units.BattleObjects.UnitCurrentStatus.UnitTeam.PLAYER ||
targetUnit.stats.status.team == Units.BattleObjects.UnitCurrentStatus.UnitTeam.NPC))
) )
{ {
return 0; return 0;
@ -158,7 +159,7 @@ namespace Johnmagotchi.GameContent.Objects.Maps
// MovementCostTable.getMoveCost(selectedUnit.stats.movementType, destTile.Type); // MovementCostTable.getMoveCost(selectedUnit.stats.movementType, destTile.Type);
// note that the return value MUST be <= moves remaining, or else we risk infinite recursion // 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<Tuple<int, int>> RemoveDuplicates( List<Tuple<int, int>> oldList) private List<Tuple<int, int>> RemoveDuplicates( List<Tuple<int, int>> oldList)
@ -190,9 +191,10 @@ namespace Johnmagotchi.GameContent.Objects.Maps
private void addAttackRangesToList( ref List<Tuple<int, int>> list) { private void addAttackRangesToList( ref List<Tuple<int, int>> list) {
for (int i = selectedUnit.DirectAttackRangeMin; i <= selectedUnit.DirectAttackRangeMax; i++) { //TODO -- add attack ranges based on available attacks
getCircleRange(ref list, i); //for (int i = selectedUnit.stats.baseStatsDirectAttackRangeMin; i <= selectedUnit.DirectAttackRangeMax; i++) {
} // getCircleRange(ref list, i);
//}
} }

View File

@ -1,4 +1,5 @@
using Johnmagotchi.Core.tools; using Johnmagotchi.Core.tools;
using Johnmagotchi.GameContent.Objects.Units;
using Johnmagotchi.GameContent.Units; using Johnmagotchi.GameContent.Units;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Graphics;
@ -21,7 +22,7 @@ namespace Johnmagotchi.GameContent.Objects.UI
Texture2D NpcDisplayTexture; Texture2D NpcDisplayTexture;
protected SpriteFont kemco; protected SpriteFont kemco;
protected SpriteFont pixsplit; protected SpriteFont pixsplit;
UnitObject HighlightedUnit; Unit HighlightedUnit;
Boolean showDisplay; Boolean showDisplay;
@ -44,7 +45,7 @@ namespace Johnmagotchi.GameContent.Objects.UI
} }
public void Update(UnitObject unit) { public void Update(Unit unit) {
if (unit == null) { if (unit == null) {
showDisplay = false; showDisplay = false;
return; return;
@ -62,7 +63,7 @@ namespace Johnmagotchi.GameContent.Objects.UI
if (HighlightedUnit == null) { return; } if (HighlightedUnit == null) { return; }
Texture2D texture = UnitDisplayTexture; Texture2D texture = UnitDisplayTexture;
if (HighlightedUnit.team == UnitObject.UnitTeam.ENEMY) if (HighlightedUnit.stats.status.team == Unit.UnitTeam.ENEMY)
{ {
texture = EnemyDisplayTexture; texture = EnemyDisplayTexture;
} }
@ -95,7 +96,7 @@ namespace Johnmagotchi.GameContent.Objects.UI
DrawText(posX, posY, HighlightedUnit.playerClassEnum.ToString()); DrawText(posX, posY, HighlightedUnit.playerClassEnum.ToString());
posX += (int)Math.Round(.05 * DISPLAY_WIDTH); posX += (int)Math.Round(.05 * DISPLAY_WIDTH);
posY += (15 * ScreenManager.BASE_ZOOM_LEVEL); 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); DrawText(posX, posY, DisplayString);
} }

View File

@ -2,6 +2,7 @@ using Johnmagotchi.Core.tools;
using Johnmagotchi.GameContent.Logic; using Johnmagotchi.GameContent.Logic;
using Johnmagotchi.GameContent.Objects; using Johnmagotchi.GameContent.Objects;
using Johnmagotchi.GameContent.Objects.Maps; using Johnmagotchi.GameContent.Objects.Maps;
using Johnmagotchi.GameContent.Objects.Units;
using Johnmagotchi.GameContent.Screens.Menu.BattleMap; using Johnmagotchi.GameContent.Screens.Menu.BattleMap;
using Johnmagotchi.GameContent.Units; using Johnmagotchi.GameContent.Units;
using Johnmagotchi.Screen.BattleMapScreens; using Johnmagotchi.Screen.BattleMapScreens;
@ -20,8 +21,8 @@ namespace Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen
END_ACTION, END_ACTION,
} }
UnitObject selectedToMoveUnit; Unit selectedToMoveUnit;
UnitObject attackedUnit; Unit attackedUnit;
private Tuple<int, int> originalLocation; private Tuple<int, int> originalLocation;
private List<Tuple<int, int>> validMoves; private List<Tuple<int, int>> validMoves;
private List<Tuple<int, int>> validAttacks; private List<Tuple<int, int>> validAttacks;
@ -59,11 +60,11 @@ namespace Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen
TibzLog.Debug("Select Pressed"); TibzLog.Debug("Select Pressed");
UnitObject newSelectedUnit = CurrentMap.getUnitAtLocation(cursorIndexX, cursorIndexY); Unit newSelectedUnit = CurrentMap.getUnitAtLocation(cursorIndexX, cursorIndexY);
TibzLog.Debug(newSelectedUnit.UnitLoadout.AvailableAttacks); // TibzLog.Debug( newSelectedUnit.stats.loadout.AvailableAttacks);
if (newSelectedUnit != null && newSelectedUnit.isTurnOver == false && selectedToMoveUnit == null) if (newSelectedUnit != null && newSelectedUnit.stats.status.isTurnOver == false && selectedToMoveUnit == null)
{ {
selectedToMoveUnit = newSelectedUnit; // selectedToMoveUnit
this.originalLocation = new Tuple<int, int>(cursorIndexX, cursorIndexY); this.originalLocation = new Tuple<int, int>(cursorIndexX, cursorIndexY);
ShowAllMoveHighlights(); ShowAllMoveHighlights();
@ -93,7 +94,7 @@ namespace Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen
ShowDirectAttackHighlights(); ShowDirectAttackHighlights();
// This menu directly calls: // This menu directly calls:
//AfterMoveWait(), AfterMoveAttack(), AfterMoveWait() //AfterMoveWait(), AfterMoveAttack(), AfterMoveWait()
TibzLog.Debug(selectedToMoveUnit.UnitLoadout.AvailableAttacks); TibzLog.Debug(selectedToMoveUnit.stats.loadout.AvailableAttacks);
screenManager.addScreen( screenManager.addScreen(
new AfterMovementMenu( new AfterMovementMenu(
this, this,
@ -166,29 +167,29 @@ namespace Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen
// throw new NotImplementedException(); // throw new NotImplementedException();
} }
public List<Tuple<int, int>> GetValidMoveCoordinates(UnitObject unit, Tuple<int, int> coords) public List<Tuple<int, int>> GetValidMoveCoordinates(Unit unit, Tuple<int, int> coords)
{ {
List<Tuple<int, int>> validTiles = new List<Tuple<int, int>>(); List<Tuple<int, int>> validTiles = new List<Tuple<int, int>>();
int x = coords.Item1; int x = coords.Item1;
int y = coords.Item2; int y = coords.Item2;
int range = unit.stats.Movement; int range = unit.stats.baseStats.Movement;
// tree traversal time // tree traversal time
TibzLog.Debug(" - BM screen - "); TibzLog.Debug(" - BM screen - ");
TibzLog.Debug(unit.stats.movementType); TibzLog.Debug(unit.stats.baseStats.movementType);
MapMovementNode rootNode = new MapMovementNode(unit, CurrentMap, range, x, y); MapMovementNode rootNode = new MapMovementNode(unit, CurrentMap, range, x, y);
rootNode.GetMoveLocations(MapMovementNode.ParentNodeLocation.ROOT, ref validTiles); rootNode.GetMoveLocations(MapMovementNode.ParentNodeLocation.ROOT, ref validTiles);
return validTiles; return validTiles;
} }
public List<Tuple<int, int>> GetValidAttackHighlights(UnitObject unit, Tuple<int, int> coords) public List<Tuple<int, int>> GetValidAttackHighlights(Unit unit, Tuple<int, int> coords)
{ {
List<Tuple<int, int>> validTiles = new List<Tuple<int, int>>(); List<Tuple<int, int>> validTiles = new List<Tuple<int, int>>();
int x = coords.Item1; int x = coords.Item1;
int y = coords.Item2; int y = coords.Item2;
int range = unit.stats.Movement; int range = unit.stats.baseStats.Movement;
MapMovementNode rootNode = new MapMovementNode(unit, CurrentMap, range, x, y); MapMovementNode rootNode = new MapMovementNode(unit, CurrentMap, range, x, y);
rootNode.getDirectAttackLocations(MapMovementNode.ParentNodeLocation.ROOT, ref validTiles); rootNode.getDirectAttackLocations(MapMovementNode.ParentNodeLocation.ROOT, ref validTiles);
@ -229,7 +230,7 @@ namespace Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen
private void finishMovement() private void finishMovement()
{ {
this.selectedToMoveUnit.isTurnOver = true; this.selectedToMoveUnit.stats.status.isTurnOver = true;
this.selectedToMoveUnit = null; this.selectedToMoveUnit = null;
} }