From cb8a2ec887b104014256b5846037993ec7486a38 Mon Sep 17 00:00:00 2001 From: Retera Date: Sun, 27 Jun 2021 17:12:57 -0400 Subject: [PATCH] Work on repair ability --- .../viewer5/handlers/w3x/War3MapViewer.java | 10 +- .../w3x/simulation/CDestructable.java | 5 + .../w3x/simulation/CDestructableType.java | 14 +- .../handlers/w3x/simulation/CItem.java | 5 + .../handlers/w3x/simulation/CItemType.java | 20 +-- .../handlers/w3x/simulation/CUnit.java | 5 + .../handlers/w3x/simulation/CUnitType.java | 10 +- .../handlers/w3x/simulation/CWidget.java | 2 + .../abilities/build/CAbilityHumanRepair.java | 135 ++++++++++++++++++ .../CAbilityTypeDefinitionHumanRepair.java | 37 +++++ .../types/impl/CAbilityTypeHumanRepair.java | 25 ++++ .../CAbilityTypeHumanRepairLevelData.java | 38 +++++ .../behaviors/CAbstractRangedBehavior.java | 2 +- .../simulation/behaviors/CBehaviorAttack.java | 4 +- .../simulation/behaviors/CBehaviorFollow.java | 2 +- .../behaviors/build/CBehaviorHumanRepair.java | 88 ++++++++++++ .../behaviors/build/CBehaviorOrcBuild.java | 2 +- .../behaviors/build/CBehaviorUndeadBuild.java | 2 +- .../behaviors/harvest/CBehaviorHarvest.java | 4 +- .../harvest/CBehaviorReturnResources.java | 2 +- .../inventory/CBehaviorDropItem.java | 2 +- .../behaviors/inventory/CBehaviorGetItem.java | 2 +- .../w3x/simulation/data/CAbilityData.java | 10 +- .../simulation/data/CDestructableData.java | 2 +- .../w3x/simulation/data/CItemData.java | 2 +- .../w3x/simulation/data/CUnitData.java | 2 +- 26 files changed, 387 insertions(+), 45 deletions(-) create mode 100644 core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/build/CAbilityHumanRepair.java create mode 100644 core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/definitions/impl/CAbilityTypeDefinitionHumanRepair.java create mode 100644 core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeHumanRepair.java create mode 100644 core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeHumanRepairLevelData.java create mode 100644 core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/build/CBehaviorHumanRepair.java diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/War3MapViewer.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/War3MapViewer.java index dbd628d..2b96e13 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/War3MapViewer.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/War3MapViewer.java @@ -1077,11 +1077,17 @@ public class War3MapViewer extends AbstractMdxModelViewer { final int playerIndex = unit.getPlayer(); final int customTeamColor = unit.getCustomTeamColor(); final float unitAngle = unit.getAngle(); + int editorConfigHitPointPercent = unit.getHitpoints(); final CUnit unitCreated = createNewUnit(modifications, unitId, unitX, unitY, unitZ, playerIndex, customTeamColor, unitAngle); - if (unit.getGoldAmount() != 0) { - unitCreated.setGold(unit.getGoldAmount()); + if(unitCreated != null) { + if (editorConfigHitPointPercent > 0) { + unitCreated.setLife(simulation, unitCreated.getMaximumLife() * (editorConfigHitPointPercent / 100f)); + } + if (unit.getGoldAmount() != 0) { + unitCreated.setGold(unit.getGoldAmount()); + } } } } diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CDestructable.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CDestructable.java index d5f1e8f..6c22f03 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CDestructable.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CDestructable.java @@ -24,6 +24,11 @@ public class CDestructable extends CWidget { this.pathingInstanceDeath = pathingInstanceDeath; } + @Override + public float getMaxLife() { + return destType.getMaxLife(); + } + @Override public float getFlyHeight() { return 0; diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CDestructableType.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CDestructableType.java index c13bea6..db73f8b 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CDestructableType.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CDestructableType.java @@ -8,18 +8,18 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType; public class CDestructableType { private final String name; - private final float life; + private final float maxLife; private final EnumSet targetedAs; private final String armorType; private final int buildTime; private final BufferedImage pathingPixelMap; private final BufferedImage pathingDeathPixelMap; - public CDestructableType(final String name, final float life, final EnumSet targetedAs, - final String armorType, final int buildTime, final BufferedImage pathingPixelMap, - final BufferedImage pathingDeathPixelMap) { + public CDestructableType(final String name, final float maxLife, final EnumSet targetedAs, + final String armorType, final int buildTime, final BufferedImage pathingPixelMap, + final BufferedImage pathingDeathPixelMap) { this.name = name; - this.life = life; + this.maxLife = maxLife; this.targetedAs = targetedAs; this.armorType = armorType; this.buildTime = buildTime; @@ -31,8 +31,8 @@ public class CDestructableType { return this.name; } - public float getLife() { - return this.life; + public float getMaxLife() { + return this.maxLife; } public EnumSet getTargetedAs() { diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CItem.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CItem.java index 2548e4d..9ee90b4 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CItem.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CItem.java @@ -73,6 +73,11 @@ public class CItem extends CWidget { return this.hidden; } + @Override + public float getMaxLife() { + return itemType.getMaxLife(); + } + public void setPointAndCheckUnstuck(final float newX, final float newY, final CSimulation game) { final CWorldCollision collision = game.getWorldCollision(); final PathingGrid pathingGrid = game.getPathingGrid(); diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CItemType.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CItemType.java index 47de954..98ea433 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CItemType.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CItemType.java @@ -17,7 +17,7 @@ public class CItemType { private final int stockMax; private final int stockReplenishInterval; private final int stockStartDelay; - private final int hitPoints; + private final int maxLife; private final String armorType; private final int level; private final int levelUnclassified; @@ -30,12 +30,12 @@ public class CItemType { private final boolean includeAsRandomChoice; public CItemType(final List abilityList, final War3ID cooldownGroup, final boolean ignoreCooldown, - final int numberOfCharges, final boolean activelyUsed, final boolean perishable, - final boolean useAutomaticallyWhenAcquired, final int goldCost, final int lumberCost, final int stockMax, - final int stockReplenishInterval, final int stockStartDelay, final int hitPoints, final String armorType, - final int level, final int levelUnclassified, final int priority, final boolean sellable, - final boolean pawnable, final boolean droppedWhenCarrierDies, final boolean canBeDropped, - final boolean validTargetForTransformation, final boolean includeAsRandomChoice) { + final int numberOfCharges, final boolean activelyUsed, final boolean perishable, + final boolean useAutomaticallyWhenAcquired, final int goldCost, final int lumberCost, final int stockMax, + final int stockReplenishInterval, final int stockStartDelay, final int maxLife, final String armorType, + final int level, final int levelUnclassified, final int priority, final boolean sellable, + final boolean pawnable, final boolean droppedWhenCarrierDies, final boolean canBeDropped, + final boolean validTargetForTransformation, final boolean includeAsRandomChoice) { this.abilityList = abilityList; this.cooldownGroup = cooldownGroup; this.ignoreCooldown = ignoreCooldown; @@ -48,7 +48,7 @@ public class CItemType { this.stockMax = stockMax; this.stockReplenishInterval = stockReplenishInterval; this.stockStartDelay = stockStartDelay; - this.hitPoints = hitPoints; + this.maxLife = maxLife; this.armorType = armorType; this.level = level; this.levelUnclassified = levelUnclassified; @@ -109,8 +109,8 @@ public class CItemType { return this.stockStartDelay; } - public int getHitPoints() { - return this.hitPoints; + public int getMaxLife() { + return this.maxLife; } public String getArmorType() { diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnit.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnit.java index 48fd227..10f63ea 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnit.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnit.java @@ -1221,6 +1221,11 @@ public class CUnit extends CWidget { setPointAndCheckUnstuck(structure.getX(), structure.getY(), simulation); } + @Override + public float getMaxLife() { + return unitType.getMaxLife(); + } + @Override public void setLife(final CSimulation simulation, final float life) { final boolean wasDead = isDead(); diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnitType.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnitType.java index 50b27f9..c0fdf41 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnitType.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnitType.java @@ -22,7 +22,7 @@ public class CUnitType { private final String name; private final String legacyName; private final War3ID typeId; - private final int life; + private final int maxLife; private final int manaInitial; private final int manaMaximum; private final int speed; @@ -75,7 +75,7 @@ public class CUnitType { private final int properNamesCount; private final boolean canFlee; - public CUnitType(final String name, final String legacyName, final War3ID typeId, final int life, + public CUnitType(final String name, final String legacyName, final War3ID typeId, final int maxLife, final int manaInitial, final int manaMaximum, final int speed, final int defense, final String abilityList, final boolean isBldg, final MovementType movementType, final float defaultFlyingHeight, final float collisionSize, final EnumSet classifications, @@ -95,7 +95,7 @@ public class CUnitType { this.name = name; this.legacyName = legacyName; this.typeId = typeId; - this.life = life; + this.maxLife = maxLife; this.manaInitial = manaInitial; this.manaMaximum = manaMaximum; this.speed = speed; @@ -158,8 +158,8 @@ public class CUnitType { return this.typeId; } - public int getLife() { - return this.life; + public int getMaxLife() { + return this.maxLife; } public int getManaInitial() { diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CWidget.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CWidget.java index 1ae17c3..2cc5018 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CWidget.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CWidget.java @@ -62,6 +62,8 @@ public abstract class CWidget implements AbilityTarget { return this.life <= 0; } + public abstract float getMaxLife(); + public abstract boolean canBeTargetedBy(CSimulation simulation, CUnit source, final EnumSet targetsAllowed); diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/build/CAbilityHumanRepair.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/build/CAbilityHumanRepair.java new file mode 100644 index 0000000..898bd82 --- /dev/null +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/build/CAbilityHumanRepair.java @@ -0,0 +1,135 @@ +package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build; + +import com.etheller.warsmash.util.War3ID; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CSimulation; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnit; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CWidget; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.AbstractGenericSingleIconActiveAbility; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityPointTarget; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.behaviors.CBehavior; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.behaviors.build.CBehaviorHumanRepair; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.orders.OrderIds; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.util.AbilityActivationReceiver; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.util.AbilityTargetCheckReceiver; + +import java.util.EnumSet; + +public class CAbilityHumanRepair extends AbstractGenericSingleIconActiveAbility { + private EnumSet targetsAllowed; + private final float navalRangeBonus; + private final float repairCostRatio; + private final float repairTimeRatio; + private final float castRange; + private CBehaviorHumanRepair behaviorRepair; + + public CAbilityHumanRepair(int handleId, War3ID alias, EnumSet targetsAllowed, + float navalRangeBonus, float repairCostRatio, float repairTimeRatio, + float castRange) { + super(handleId, alias); + this.targetsAllowed = targetsAllowed; + this.navalRangeBonus = navalRangeBonus; + this.repairCostRatio = repairCostRatio; + this.repairTimeRatio = repairTimeRatio; + this.castRange = castRange; + } + + @Override + protected void innerCheckCanTarget(CSimulation game, CUnit unit, int orderId, CWidget target, AbilityTargetCheckReceiver receiver) { + if(target.canBeTargetedBy(game, unit, targetsAllowed)) { + receiver.targetOk(target); + } else { + receiver.orderIdNotAccepted(); + } + } + + @Override + protected void innerCheckCanSmartTarget(CSimulation game, CUnit unit, int orderId, CWidget target, AbilityTargetCheckReceiver receiver) { + innerCheckCanTarget(game, unit, orderId, target, receiver); + } + + @Override + protected void innerCheckCanTarget(CSimulation game, CUnit unit, int orderId, AbilityPointTarget target, AbilityTargetCheckReceiver receiver) { + receiver.mustTargetType(AbilityTargetCheckReceiver.TargetType.UNIT); + } + + @Override + protected void innerCheckCanSmartTarget(CSimulation game, CUnit unit, int orderId, AbilityPointTarget target, AbilityTargetCheckReceiver receiver) { + innerCheckCanTarget(game, unit, orderId, target, receiver); + } + + @Override + protected void innerCheckCanTargetNoTarget(CSimulation game, CUnit unit, int orderId, AbilityTargetCheckReceiver receiver) { + receiver.orderIdNotAccepted(); + } + + @Override + protected void innerCheckCanUse(CSimulation game, CUnit unit, int orderId, AbilityActivationReceiver receiver) { + receiver.useOk(); + } + + @Override + public void onAdd(CSimulation game, CUnit unit) { + behaviorRepair = new CBehaviorHumanRepair(unit, this); + } + + @Override + public void onRemove(CSimulation game, CUnit unit) { + + } + + @Override + public void onTick(CSimulation game, CUnit unit) { + + } + + @Override + public void onCancelFromQueue(CSimulation game, CUnit unit, int orderId) { + + } + + @Override + public CBehavior begin(CSimulation game, CUnit caster, int orderId, CWidget target) { + return behaviorRepair.reset(target); + } + + @Override + public CBehavior begin(CSimulation game, CUnit caster, int orderId, AbilityPointTarget point) { + return null; + } + + @Override + public CBehavior beginNoTarget(CSimulation game, CUnit caster, int orderId) { + return null; + } + + @Override + public int getBaseOrderId() { + return OrderIds.repair; + } + + @Override + public boolean isToggleOn() { + return false; + } + + public EnumSet getTargetsAllowed() { + return targetsAllowed; + } + + public float getNavalRangeBonus() { + return navalRangeBonus; + } + + public float getRepairCostRatio() { + return repairCostRatio; + } + + public float getRepairTimeRatio() { + return repairTimeRatio; + } + + public float getCastRange() { + return castRange; + } +} diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/definitions/impl/CAbilityTypeDefinitionHumanRepair.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/definitions/impl/CAbilityTypeDefinitionHumanRepair.java new file mode 100644 index 0000000..758d6ad --- /dev/null +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/definitions/impl/CAbilityTypeDefinitionHumanRepair.java @@ -0,0 +1,37 @@ +package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl; + +import com.etheller.warsmash.units.manager.MutableObjectData.MutableGameObject; +import com.etheller.warsmash.util.War3ID; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.CAbilityType; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.CAbilityTypeDefinition; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl.CAbilityTypeHumanRepair; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl.CAbilityTypeHumanRepairLevelData; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType; + +import java.util.EnumSet; +import java.util.List; + +public class CAbilityTypeDefinitionHumanRepair extends AbstractCAbilityTypeDefinition + implements CAbilityTypeDefinition { + protected static final War3ID COST_RATIO = War3ID.fromString("Rep1"); + protected static final War3ID TIME_RATIO = War3ID.fromString("Rep2"); + protected static final War3ID NAVAL_RANGE_BONUS = War3ID.fromString("Rep5"); + + @Override + protected CAbilityTypeHumanRepairLevelData createLevelData(final MutableGameObject abilityEditorData, final int level) { + final String targetsAllowedAtLevelString = abilityEditorData.getFieldAsString(TARGETS_ALLOWED, level); + final EnumSet targetsAllowedAtLevel = CTargetType.parseTargetTypeSet(targetsAllowedAtLevelString); + final float costRatio = abilityEditorData.getFieldAsFloat(COST_RATIO, level); + final float timeRatio = abilityEditorData.getFieldAsFloat(TIME_RATIO, level); + final float navalRangeBonus = abilityEditorData.getFieldAsFloat(NAVAL_RANGE_BONUS, level); + final float castRange = abilityEditorData.getFieldAsFloat(CAST_RANGE, level); + return new CAbilityTypeHumanRepairLevelData(targetsAllowedAtLevel, navalRangeBonus, costRatio, timeRatio, castRange); + } + + @Override + protected CAbilityType innerCreateAbilityType(final War3ID alias, final MutableGameObject abilityEditorData, + final List levelData) { + return new CAbilityTypeHumanRepair(alias, abilityEditorData.getCode(), levelData); + } + +} diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeHumanRepair.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeHumanRepair.java new file mode 100644 index 0000000..e1c7692 --- /dev/null +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeHumanRepair.java @@ -0,0 +1,25 @@ +package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl; + +import com.etheller.warsmash.util.War3ID; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbility; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAbilityHumanRepair; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.CAbilityType; + +import java.util.List; + +public class CAbilityTypeHumanRepair extends CAbilityType { + + public CAbilityTypeHumanRepair(final War3ID alias, final War3ID code, + final List levelData) { + super(alias, code, levelData); + } + + @Override + public CAbility createAbility(final int handleId) { + final CAbilityTypeHumanRepairLevelData levelData = getLevelData(0); + return new CAbilityHumanRepair(handleId, getAlias(), levelData.getTargetsAllowed(), + levelData.getNavalRangeBonus(), levelData.getRepairCostRatio(), levelData.getRepairTimeRatio(), + levelData.getCastRange()); + } + +} diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeHumanRepairLevelData.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeHumanRepairLevelData.java new file mode 100644 index 0000000..834bf87 --- /dev/null +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilities/types/impl/CAbilityTypeHumanRepairLevelData.java @@ -0,0 +1,38 @@ +package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl; + +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.CAbilityTypeLevelData; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType; + +import java.util.EnumSet; + +public class CAbilityTypeHumanRepairLevelData extends CAbilityTypeLevelData { + + private final float navalRangeBonus; + private final float repairCostRatio; + private final float repairTimeRatio; + private final float castRange; + + public CAbilityTypeHumanRepairLevelData(EnumSet targetsAllowed, float navalRangeBonus, float repairCostRatio, float repairTimeRatio, float castRange) { + super(targetsAllowed); + this.navalRangeBonus = navalRangeBonus; + this.repairCostRatio = repairCostRatio; + this.repairTimeRatio = repairTimeRatio; + this.castRange = castRange; + } + + public float getCastRange() { + return this.castRange; + } + + public float getNavalRangeBonus() { + return navalRangeBonus; + } + + public float getRepairCostRatio() { + return repairCostRatio; + } + + public float getRepairTimeRatio() { + return repairTimeRatio; + } +} diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/CAbstractRangedBehavior.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/CAbstractRangedBehavior.java index 651f23c..ba079eb 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/CAbstractRangedBehavior.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/CAbstractRangedBehavior.java @@ -36,7 +36,7 @@ public abstract class CAbstractRangedBehavior implements CRangedBehavior { return this; } - protected abstract CBehavior update(CSimulation simulation, boolean withinRange); + protected abstract CBehavior update(CSimulation simulation, boolean withinFacingWindow); protected abstract CBehavior updateOnInvalidTarget(CSimulation simulation); diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/CBehaviorAttack.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/CBehaviorAttack.java index 1750c82..a679215 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/CBehaviorAttack.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/CBehaviorAttack.java @@ -71,10 +71,10 @@ public class CBehaviorAttack extends CAbstractRangedBehavior { } @Override - public CBehavior update(final CSimulation simulation, final boolean withinRange) { + public CBehavior update(final CSimulation simulation, final boolean withinFacingWindow) { final int cooldownEndTime = this.unit.getCooldownEndTime(); final int currentTurnTick = simulation.getGameTurnTick(); - if (withinRange) { + if (withinFacingWindow) { if (this.damagePointLaunchTime != 0) { if (currentTurnTick >= this.damagePointLaunchTime) { int minDamage = this.unitAttack.getMinDamage(); diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/CBehaviorFollow.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/CBehaviorFollow.java index 2134745..2579932 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/CBehaviorFollow.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/CBehaviorFollow.java @@ -30,7 +30,7 @@ public class CBehaviorFollow extends CAbstractRangedBehavior { } @Override - protected CBehavior update(final CSimulation simulation, final boolean withinRange) { + protected CBehavior update(final CSimulation simulation, final boolean withinFacingWindow) { this.unit.getUnitAnimationListener().playAnimation(false, PrimaryTag.STAND, SequenceUtils.EMPTY, 1.0f, false); return this; } diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/build/CBehaviorHumanRepair.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/build/CBehaviorHumanRepair.java new file mode 100644 index 0000000..3305554 --- /dev/null +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/build/CBehaviorHumanRepair.java @@ -0,0 +1,88 @@ +package com.etheller.warsmash.viewer5.handlers.w3x.simulation.behaviors.build; + +import com.etheller.warsmash.viewer5.handlers.w3x.AnimationTokens; +import com.etheller.warsmash.viewer5.handlers.w3x.SequenceUtils; +import com.etheller.warsmash.viewer5.handlers.w3x.environment.PathingGrid; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.*; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAbilityHumanRepair; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityPointTarget; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityTargetStillAliveAndTargetableVisitor; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityTargetVisitor; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.behaviors.CAbstractRangedBehavior; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.behaviors.CBehavior; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.behaviors.harvest.CBehaviorHarvest; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.orders.OrderIds; + +public class CBehaviorHumanRepair extends CAbstractRangedBehavior { + private final CAbilityHumanRepair ability; + private AbilityTargetStillAliveAndTargetableVisitor stillAliveVisitor; + + public CBehaviorHumanRepair(CUnit unit, CAbilityHumanRepair ability) { + super(unit); + this.ability = ability; + stillAliveVisitor = new AbilityTargetStillAliveAndTargetableVisitor(); + } + + public CBehaviorHumanRepair reset(final CWidget target) { + innerReset(target, false); + return this; + } + + @Override + public boolean isWithinRange(CSimulation simulation) { + float castRange = ability.getCastRange(); + if(target instanceof CUnit) { + CUnit unitTarget = (CUnit)target; + if(unitTarget.getUnitType().getMovementType() == PathingGrid.MovementType.FLOAT) { + castRange += ability.getNavalRangeBonus(); + } + } + return unit.canReach(target, castRange); + } + + @Override + protected CBehavior update(CSimulation simulation, boolean withinFacingWindow) { + unit.getUnitAnimationListener().playAnimation(false, AnimationTokens.PrimaryTag.STAND, + SequenceUtils.WORK, 1.0f, true); + if(this.target instanceof CWidget) { + CWidget targetWidget = (CWidget) this.target; + float newLifeValue = targetWidget.getLife() + 1; + boolean done = newLifeValue > targetWidget.getMaxLife(); + if(done) { + newLifeValue = targetWidget.getMaxLife(); + } + targetWidget.setLife(simulation, newLifeValue); + if(done) { + return unit.pollNextOrderBehavior(simulation); + } + } + return this; + } + + @Override + protected CBehavior updateOnInvalidTarget(CSimulation simulation) { + return unit.pollNextOrderBehavior(simulation); + } + + @Override + protected boolean checkTargetStillValid(CSimulation simulation) { + return target.visit(stillAliveVisitor.reset(simulation, unit, ability.getTargetsAllowed())); + } + + @Override + protected void resetBeforeMoving(CSimulation simulation) {} + + @Override + public void begin(CSimulation game) {} + + @Override + public void end(CSimulation game, boolean interrupted) {} + + @Override + public void endMove(CSimulation game, boolean interrupted) {} + + @Override + public int getHighlightOrderId() { + return OrderIds.repair; + } +} diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/build/CBehaviorOrcBuild.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/build/CBehaviorOrcBuild.java index 1b91123..9f7cd1b 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/build/CBehaviorOrcBuild.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/build/CBehaviorOrcBuild.java @@ -45,7 +45,7 @@ public class CBehaviorOrcBuild extends CAbstractRangedBehavior { } @Override - protected CBehavior update(final CSimulation simulation, final boolean withinRange) { + protected CBehavior update(final CSimulation simulation, final boolean withinFacingWindow) { if (!this.unitCreated) { this.unitCreated = true; final CUnitType unitTypeToCreate = simulation.getUnitData().getUnitType(this.orderId); diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/build/CBehaviorUndeadBuild.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/build/CBehaviorUndeadBuild.java index 897d2c1..8640fec 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/build/CBehaviorUndeadBuild.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/build/CBehaviorUndeadBuild.java @@ -56,7 +56,7 @@ public class CBehaviorUndeadBuild extends CAbstractRangedBehavior { } @Override - protected CBehavior update(final CSimulation simulation, final boolean withinRange) { + protected CBehavior update(final CSimulation simulation, final boolean withinFacingWindow) { if (this.doneTick != 0) { if (simulation.getGameTurnTick() > this.doneTick) { return this.unit.pollNextOrderBehavior(simulation); diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/harvest/CBehaviorHarvest.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/harvest/CBehaviorHarvest.java index 3833f81..86f6e60 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/harvest/CBehaviorHarvest.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/harvest/CBehaviorHarvest.java @@ -47,7 +47,7 @@ public class CBehaviorHarvest extends CAbstractRangedBehavior @Override public boolean isWithinRange(final CSimulation simulation) { - return this.unit.canReach(this.target, this.unit.getUnitType().getCollisionSize()); + return this.unit.canReach(this.target, abilityHarvest.getTreeAttack().getRange()); } @Override @@ -56,7 +56,7 @@ public class CBehaviorHarvest extends CAbstractRangedBehavior } @Override - protected CBehavior update(final CSimulation simulation, final boolean withinRange) { + protected CBehavior update(final CSimulation simulation, final boolean withinFacingWindow) { this.simulation = simulation; return this.target.visit(this); } diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/harvest/CBehaviorReturnResources.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/harvest/CBehaviorReturnResources.java index f6b43cd..9254d29 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/harvest/CBehaviorReturnResources.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/harvest/CBehaviorReturnResources.java @@ -49,7 +49,7 @@ public class CBehaviorReturnResources extends CAbstractRangedBehavior implements } @Override - protected CBehavior update(final CSimulation simulation, final boolean withinRange) { + protected CBehavior update(final CSimulation simulation, final boolean withinFacingWindow) { this.simulation = simulation; return this.target.visit(this); } diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/inventory/CBehaviorDropItem.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/inventory/CBehaviorDropItem.java index a74bd3d..d798a0b 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/inventory/CBehaviorDropItem.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/inventory/CBehaviorDropItem.java @@ -48,7 +48,7 @@ public class CBehaviorDropItem extends CAbstractRangedBehavior { } @Override - protected CBehavior update(final CSimulation simulation, final boolean withinRange) { + protected CBehavior update(final CSimulation simulation, final boolean withinFacingWindow) { this.inventory.dropItem(simulation, this.unit, this.targetItem, this.target.getX(), this.target.getY(), true); return this.unit.pollNextOrderBehavior(simulation); } diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/inventory/CBehaviorGetItem.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/inventory/CBehaviorGetItem.java index 6568c68..749ce36 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/inventory/CBehaviorGetItem.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/behaviors/inventory/CBehaviorGetItem.java @@ -46,7 +46,7 @@ public class CBehaviorGetItem extends CAbstractRangedBehavior { } @Override - protected CBehavior update(final CSimulation simulation, final boolean withinRange) { + protected CBehavior update(final CSimulation simulation, final boolean withinFacingWindow) { final CItem targetItem = this.target.visit(AbilityTargetItemVisitor.INSTANCE); this.inventory.giveItem(simulation, this.unit, targetItem, true); return this.unit.pollNextOrderBehavior(simulation); diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CAbilityData.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CAbilityData.java index d0cdcb5..ae506a4 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CAbilityData.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CAbilityData.java @@ -10,12 +10,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbility; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbilityGeneric; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.CAbilityType; import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.CAbilityTypeDefinition; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl.CAbilityTypeDefinitionChannelTest; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl.CAbilityTypeDefinitionColdArrows; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl.CAbilityTypeDefinitionGoldMine; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl.CAbilityTypeDefinitionHarvest; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl.CAbilityTypeDefinitionInventory; -import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl.CAbilityTypeDefinitionReturnResources; +import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl.*; public class CAbilityData { @@ -36,6 +31,7 @@ public class CAbilityData { this.codeToAbilityTypeDefinition.put(War3ID.fromString("Ahar"), new CAbilityTypeDefinitionHarvest()); this.codeToAbilityTypeDefinition.put(War3ID.fromString("ANcl"), new CAbilityTypeDefinitionChannelTest()); this.codeToAbilityTypeDefinition.put(War3ID.fromString("AInv"), new CAbilityTypeDefinitionInventory()); + this.codeToAbilityTypeDefinition.put(War3ID.fromString("Arep"), new CAbilityTypeDefinitionHumanRepair()); } public CAbilityType getAbilityType(final War3ID alias) { @@ -45,7 +41,7 @@ public class CAbilityData { if (mutableGameObject == null) { return null; } - final War3ID code = mutableGameObject.getCode(); + final War3ID code = War3ID.fromString(mutableGameObject.readSLKTag("code")); final CAbilityTypeDefinition abilityTypeDefinition = this.codeToAbilityTypeDefinition.get(code); if (abilityTypeDefinition != null) { abilityType = abilityTypeDefinition.createAbilityType(alias, mutableGameObject); diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CDestructableData.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CDestructableData.java index e26ff00..a14bf8e 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CDestructableData.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CDestructableData.java @@ -45,7 +45,7 @@ public class CDestructableData { final CDestructableType unitTypeInstance = getUnitTypeInstance(typeId, unitType); - final float life = unitTypeInstance.getLife(); + final float life = unitTypeInstance.getMaxLife(); final CDestructable destructable = new CDestructable(handleId, x, y, life, unitTypeInstance, pathingInstance, pathingInstanceDeath); diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CItemData.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CItemData.java index 24ea711..ab7d092 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CItemData.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CItemData.java @@ -55,7 +55,7 @@ public class CItemData { final MutableGameObject itemType = this.itemData.get(typeId); final CItemType itemTypeInstance = getItemTypeInstance(typeId, itemType); - return new CItem(handleId, x, y, itemTypeInstance.getHitPoints(), typeId, itemTypeInstance); + return new CItem(handleId, x, y, itemTypeInstance.getMaxLife(), typeId, itemTypeInstance); } public CItemType getItemType(final War3ID typeId) { diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CUnitData.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CUnitData.java index 642c525..db27998 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CUnitData.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/data/CUnitData.java @@ -192,7 +192,7 @@ public class CUnitData { final int handleId = handleIdAllocator.createId(); final CUnitType unitTypeInstance = getUnitTypeInstance(typeId, buildingPathingPixelMap, unitType); - final int life = unitTypeInstance.getLife(); + final int life = unitTypeInstance.getMaxLife(); final int manaInitial = unitTypeInstance.getManaInitial(); final int manaMaximum = unitTypeInstance.getManaMaximum(); final int speed = unitTypeInstance.getSpeed();