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 f3609a3..3ba50bd 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/War3MapViewer.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/War3MapViewer.java @@ -1127,10 +1127,14 @@ 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 (unitCreated != null) { + 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 d9cd576..76ce324 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 @@ -25,6 +25,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 f07335d..75b32e5 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 @@ -75,7 +75,7 @@ public class CItem extends CWidget { @Override public float getMaxLife() { - return this.itemType.getHitPoints(); + return itemType.getMaxLife(); } public void setPointAndCheckUnstuck(final float newX, final float newY, final CSimulation game) { 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 fa383d2..66909b0 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 @@ -1225,6 +1225,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 01744a1..f92592e 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; @@ -76,7 +76,7 @@ public class CUnitType { private final boolean canFlee; private final int priority; - 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, @@ -96,7 +96,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; @@ -160,8 +160,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 428d9c6..a74b519 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 @@ -64,6 +64,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 1793603..9ae7eb5 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 c8686c9..1158268 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,6 +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.*; 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.CAbilityTypeDefinitionCoupleInstant; @@ -38,6 +39,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()); this.codeToAbilityTypeDefinition.put(War3ID.fromString("Avul"), new CAbilityTypeDefinitionInvulnerable()); this.codeToAbilityTypeDefinition.put(War3ID.fromString("Acoi"), new CAbilityTypeDefinitionCoupleInstant()); } 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 e558641..021b938 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();