Updates to UI

This commit is contained in:
Retera 2021-01-09 23:20:48 -05:00
parent 5283b7a038
commit 9210544e08
35 changed files with 559 additions and 109 deletions

View File

@ -1,32 +1,24 @@
[DataSources]
Count=7
Type00=MPQ
Path00="D:\Games\Warcraft III Patch 1.22\war3.mpq"
Type01=MPQ
Path01="D:\Games\Warcraft III Patch 1.22\War3x.mpq"
Type02=MPQ
Path02="D:\Games\Warcraft III Patch 1.22\War3xlocal.mpq"
Type03=MPQ
Path03="D:\Games\Warcraft III Patch 1.22\War3Patch.mpq"
Count=5
Type00=Folder
Path00="D:\Games\Warcraft III CASC 1.31\war3.w3mod"
Type01=Folder
Path01="D:\Games\Warcraft III CASC 1.31\war3.w3mod\_locales\enus.w3mod"
Type02=Folder
Path02="..\..\resources"
Type03=Folder
Path03="D:\Backups\Warsmash\Data"
Type04=Folder
Path04="..\..\resources"
Type05=Folder
Path05="D:\Backups\Warsmash\Data"
Type06=Folder
Path06="."
Path04="."
[Map]
//FilePath="CombatUnitTests.w3x"
//FilePath="PitchRoll.w3x"
FilePath="PeonStartingBase.w3x"
//FilePath="DungeonGoldMine.w3m"
//FilePath="PlayerPeasants.w3m"
//FilePath="FireLord.w3x"
//FilePath="ReforgedGeorgeVacation.w3x"
//FilePath="Maps\Campaign\NightElf03.w3m"
//FilePath="PhoenixAttack.w3x"
//FilePath="LightEnvironmentTest.w3x"
//FilePath="PrivateDontShare/Cult 8.w3x"
//FilePath="TorchLight2.w3x"
//FilePath="OrcAssault.w3x"
//FilePath="FrostyVsFarm.w3m"
//FilePath="ModelTest.w3x"
//FilePath="SpinningSample.w3x"
FilePath="PeonStartingBase.w3x"
//FilePath="PhoenixAttack.w3x"
//FilePath="OperationReforged.w3x"
//FilePath="AzerothRoleplay1.909t03DecoratedV2.w3x"

View File

@ -0,0 +1,37 @@
[DataSources]
Count=7
Type00=MPQ
Path00="D:\Games\Warcraft III Patch 1.22\war3.mpq"
Type01=MPQ
Path01="D:\Games\Warcraft III Patch 1.22\War3x.mpq"
Type02=MPQ
Path02="D:\Games\Warcraft III Patch 1.22\War3xlocal.mpq"
Type03=MPQ
Path03="D:\Games\Warcraft III Patch 1.22\War3Patch.mpq"
Type04=Folder
Path04="..\..\resources"
Type05=Folder
Path05="D:\Backups\Warsmash\Data"
Type06=Folder
Path06="."
[Map]
//FilePath="CombatUnitTests.w3x"
//FilePath="PitchRoll.w3x"
FilePath="PeonStartingBase.w3x"
//FilePath="ColdArrows.w3m"
//FilePath="DungeonGoldMine.w3m"
//FilePath="PlayerPeasants.w3m"
//FilePath="FireLord.w3x"
//FilePath="Maps\Campaign\NightElf03.w3m"
//FilePath="PhoenixAttack.w3x"
//FilePath="LightEnvironmentTest.w3x"
//FilePath="TorchLight2.w3x"
//FilePath="OrcAssault.w3x"
//FilePath="FrostyVsFarm.w3m"
//FilePath="ModelTest.w3x"
//FilePath="SpinningSample.w3x"
//FilePath="Maps\Campaign\Prologue02.w3m"
//FilePath="Pathing.w3x"
//FilePath="ItemFacing.w3x"
//FilePath=SomeParticleTests.w3x

View File

@ -1,22 +0,0 @@
[DataSources]
Count=5
Type00=Folder
Path00="E:\Games\Warcraft III CASC 1.31\war3.w3mod"
Type01=Folder
Path01="E:\Games\Warcraft III CASC 1.31\war3.w3mod\_locales\enus.w3mod"
Type02=Folder
Path02="..\..\resources"
Type03=Folder
Path03="E:\Backups\Warsmash\Data"
Type04=Folder
Path04="."
[Map]
//FilePath="PitchRoll.w3x"
//FilePath="ReforgedGeorgeVacation.w3x"
//FilePath="Maps\Campaign\NightElf03.w3m"
//FilePath="PrivateDontShare/Cult 8.w3x"
//FilePath="TorchLight2.w3x"
//FilePath="OrcAssault.w3x"
//FilePath="PeonStartingBase.w3x"
FilePath="PhoenixAttack.w3x"

View File

@ -360,7 +360,7 @@ public class MdlxModel {
break;
case MdlUtils.TOKEN_TEXTURE_ANIMS:
this.loadNumberedObjectBlock(this.textureAnimations, MdlxBlockDescriptor.TEXTURE_ANIMATION,
MdlUtils.TOKEN_TEXTURE_ANIM, stream);
MdlUtils.TOKEN_TVERTEX_ANIM, stream);
break;
case MdlUtils.TOKEN_GEOSET:
this.loadObject(this.geosets, MdlxBlockDescriptor.GEOSET, stream);

View File

@ -30,6 +30,7 @@ public class MdlUtils {
public static final String TOKEN_BITMAP = "Bitmap";
public static final String TOKEN_TVERTEX_ANIM_SPACE = "TVertexAnim ";
public static final String TOKEN_TVERTEX_ANIM = "TVertexAnim";
public static final String TOKEN_DONT_INTERP = "DontInterp";
public static final String TOKEN_LINEAR = "Linear";
@ -177,7 +178,6 @@ public class MdlUtils {
public static final String TOKEN_TEXTURES = "Textures";
public static final String TOKEN_MATERIALS = "Materials";
public static final String TOKEN_TEXTURE_ANIMS = "TextureAnims";
public static final String TOKEN_TEXTURE_ANIM = "TextureAnim";
public static final String TOKEN_PIVOT_POINTS = "PivotPoints";
public static final String TOKEN_ATTACHMENT = "Attachment";

View File

@ -1,7 +1,7 @@
package com.etheller.warsmash.util;
public class WarsmashConstants {
public static final int MAX_PLAYERS = 16;
public static final int MAX_PLAYERS = 28;
public static final int REPLACEABLE_TEXTURE_LIMIT = 64;
public static final float SIMULATION_STEP_TIME = 1 / 20f;
public static final int PORT_NUMBER = 6115;

View File

@ -848,7 +848,11 @@ public class War3MapViewer extends AbstractMdxModelViewer {
final int playerIndex = unit.getPlayer();
final float unitAngle = unit.getAngle();
createNewUnit(modifications, unitId, unitX, unitY, unitZ, playerIndex, unitAngle);
final CUnit unitCreated = createNewUnit(modifications, unitId, unitX, unitY, unitZ, playerIndex,
unitAngle);
if (unit.getGoldAmount() != 0) {
unitCreated.setGold(unit.getGoldAmount());
}
}
}
this.simulation.unitsLoaded();

View File

@ -2,6 +2,7 @@ package com.etheller.warsmash.viewer5.handlers.w3x.rendersim.commandbuttons;
import com.etheller.warsmash.util.War3ID;
import com.etheller.warsmash.viewer5.handlers.w3x.rendersim.ability.AbilityDataUI;
import com.etheller.warsmash.viewer5.handlers.w3x.rendersim.ability.AbilityIconUI;
import com.etheller.warsmash.viewer5.handlers.w3x.rendersim.ability.IconUI;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CSimulation;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnit;
@ -19,6 +20,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAb
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAbilityOrcBuild;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAbilityUndeadBuild;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.combat.CAbilityColdArrows;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericNoIconAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericSingleIconActiveAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityQueue;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityRally;
@ -101,12 +103,18 @@ public class CommandCardPopulatingAbilityVisitor implements CAbilityVisitor<Void
@Override
public Void accept(final GenericSingleIconActiveAbility ability) {
if ((this.menuBaseOrderId == 0) && ability.isIconShowing()) {
addCommandButton(ability, this.abilityDataUI.getUI(ability.getAlias()).getOnIconUI(), ability.getHandleId(),
ability.getBaseOrderId(), 0, false, false);
final AbilityIconUI ui = this.abilityDataUI.getUI(ability.getAlias());
addCommandButton(ability, ability.isToggleOn() ? ui.getOffIconUI() : ui.getOnIconUI(),
ability.getHandleId(), ability.getBaseOrderId(), 0, false, false);
}
return null;
}
@Override
public Void accept(final GenericNoIconAbility ability) {
return null;
}
@Override
public Void accept(final CAbilityRally ability) {
if (this.menuBaseOrderId == 0) {

View File

@ -19,6 +19,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.environment.PathingGrid.Remova
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnitStateListener.CUnitStateNotifier;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAbilityBuildInProgress;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.mine.CAbilityGoldMine;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityPointTarget;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityTarget;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityTargetVisitor;
@ -1117,4 +1118,21 @@ public class CUnit extends CWidget {
this.foodUsed = foodUsed;
return delta;
}
public int getGold() {
for (final CAbility ability : this.abilities) {
if (ability instanceof CAbilityGoldMine) {
return ((CAbilityGoldMine) ability).getGold();
}
}
return 0;
}
public void setGold(final int goldAmount) {
for (final CAbility ability : this.abilities) {
if (ability instanceof CAbilityGoldMine) {
((CAbilityGoldMine) ability).setGold(goldAmount);
}
}
}
}

View File

@ -8,6 +8,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAb
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAbilityOrcBuild;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAbilityUndeadBuild;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.combat.CAbilityColdArrows;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericNoIconAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericSingleIconActiveAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityQueue;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityRally;
@ -48,4 +49,6 @@ public interface CAbilityVisitor<T> {
T accept(GenericSingleIconActiveAbility ability);
T accept(CAbilityRally ability);
T accept(GenericNoIconAbility ability);
}

View File

@ -40,7 +40,8 @@ public abstract class AbstractCAbilityBuild extends AbstractCAbility implements
final CPlayer player = game.getPlayer(unit.getPlayerIndex());
if (player.getGold() >= unitType.getGoldCost()) {
if (player.getLumber() >= unitType.getLumberCost()) {
if ((player.getFoodUsed() + unitType.getFoodUsed()) <= player.getFoodCap()) {
if ((unitType.getFoodUsed() == 0)
|| ((player.getFoodUsed() + unitType.getFoodUsed()) <= player.getFoodCap())) {
receiver.useOk();
}
else {

View File

@ -0,0 +1,32 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic;
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.abilities.AbstractCAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbilityVisitor;
public abstract class AbstractGenericNoIconAbility extends AbstractCAbility implements GenericNoIconAbility {
private final War3ID alias;
public AbstractGenericNoIconAbility(final int handleId, final War3ID alias) {
super(handleId);
this.alias = alias;
}
@Override
public boolean checkBeforeQueue(final CSimulation game, final CUnit caster, final int orderId) {
return true;
}
@Override
public <T> T visit(final CAbilityVisitor<T> visitor) {
return visitor.accept(this);
}
@Override
public War3ID getAlias() {
return this.alias;
}
}

View File

@ -27,35 +27,44 @@ public abstract class AbstractGenericSingleIconActiveAbility extends AbstractCAb
public void checkCanTarget(final CSimulation game, final CUnit unit, final int orderId, final CWidget target,
final AbilityTargetCheckReceiver<CWidget> receiver) {
if (orderId == getBaseOrderId()) {
receiver.targetOk(target);
innerCheckCanTarget(game, unit, orderId, target, receiver);
}
else {
receiver.orderIdNotAccepted();
}
}
protected abstract void innerCheckCanTarget(CSimulation game, CUnit unit, int orderId, CWidget target,
AbilityTargetCheckReceiver<CWidget> receiver);
@Override
public void checkCanTarget(final CSimulation game, final CUnit unit, final int orderId,
final AbilityPointTarget target, final AbilityTargetCheckReceiver<AbilityPointTarget> receiver) {
if (orderId == getBaseOrderId()) {
receiver.targetOk(target);
innerCheckCanTarget(game, unit, orderId, target, receiver);
}
else {
receiver.orderIdNotAccepted();
}
}
protected abstract void innerCheckCanTarget(CSimulation game, CUnit unit, int orderId, AbilityPointTarget target,
AbilityTargetCheckReceiver<AbilityPointTarget> receiver);
@Override
public void checkCanTargetNoTarget(final CSimulation game, final CUnit unit, final int orderId,
final AbilityTargetCheckReceiver<Void> receiver) {
if (orderId == getBaseOrderId()) {
receiver.targetOk(null);
innerCheckCanTargetNoTarget(game, unit, orderId, receiver);
}
else {
receiver.orderIdNotAccepted();
}
}
protected abstract void innerCheckCanTargetNoTarget(CSimulation game, CUnit unit, int orderId,
AbilityTargetCheckReceiver<Void> receiver);
@Override
public <T> T visit(final CAbilityVisitor<T> visitor) {
return visitor.accept(this);

View File

@ -0,0 +1,8 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic;
import com.etheller.warsmash.util.War3ID;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbility;
public interface GenericNoIconAbility extends CAbility {
War3ID getAlias();
}

View File

@ -9,6 +9,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.behaviors.CBehavior;
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 com.etheller.warsmash.viewer5.handlers.w3x.simulation.util.ResourceType;
public class CAbilityHarvest extends AbstractGenericSingleIconActiveAbility {
@ -59,4 +60,33 @@ public class CAbilityHarvest extends AbstractGenericSingleIconActiveAbility {
receiver.useOk();
}
@Override
protected void innerCheckCanTarget(final CSimulation game, final CUnit unit, final int orderId,
final CWidget target, final AbilityTargetCheckReceiver<CWidget> receiver) {
if (target instanceof CUnit) {
final CUnit targetUnit = (CUnit) target;
if (targetUnit.getGold() > 0) {
receiver.targetOk(target);
}
else {
receiver.mustTargetResources();
}
}
else {
receiver.mustTargetResources();
}
}
@Override
protected void innerCheckCanTarget(final CSimulation game, final CUnit unit, final int orderId,
final AbilityPointTarget target, final AbilityTargetCheckReceiver<AbilityPointTarget> receiver) {
}
@Override
protected void innerCheckCanTargetNoTarget(final CSimulation game, final CUnit unit, final int orderId,
final AbilityTargetCheckReceiver<Void> receiver) {
}
}

View File

@ -0,0 +1,92 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.mine;
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.AbstractGenericNoIconAbility;
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.util.AbilityActivationReceiver;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.util.AbilityTargetCheckReceiver;
public class CAbilityGoldMine extends AbstractGenericNoIconAbility {
private int gold;
private final float miningDuration;
private final int miningCapacity;
public CAbilityGoldMine(final int handleId, final War3ID alias, final int maxGold, final float miningDuration,
final int miningCapacity) {
super(handleId, alias);
this.gold = maxGold;
this.miningDuration = miningDuration;
this.miningCapacity = miningCapacity;
}
@Override
public void onAdd(final CSimulation game, final CUnit unit) {
}
@Override
public void onRemove(final CSimulation game, final CUnit unit) {
}
@Override
public CBehavior begin(final CSimulation game, final CUnit caster, final int orderId, final CWidget target) {
return null;
}
@Override
public CBehavior begin(final CSimulation game, final CUnit caster, final int orderId,
final AbilityPointTarget point) {
return null;
}
@Override
public CBehavior beginNoTarget(final CSimulation game, final CUnit caster, final int orderId) {
return null;
}
@Override
public void checkCanTarget(final CSimulation game, final CUnit unit, final int orderId, final CWidget target,
final AbilityTargetCheckReceiver<CWidget> receiver) {
receiver.orderIdNotAccepted();
}
@Override
public void checkCanTarget(final CSimulation game, final CUnit unit, final int orderId,
final AbilityPointTarget target, final AbilityTargetCheckReceiver<AbilityPointTarget> receiver) {
receiver.orderIdNotAccepted();
}
@Override
public void checkCanTargetNoTarget(final CSimulation game, final CUnit unit, final int orderId,
final AbilityTargetCheckReceiver<Void> receiver) {
receiver.orderIdNotAccepted();
}
@Override
protected void innerCheckCanUse(final CSimulation game, final CUnit unit, final int orderId,
final AbilityActivationReceiver receiver) {
receiver.notAnActiveAbility();
}
public int getGold() {
return this.gold;
}
public void setGold(final int gold) {
this.gold = gold;
}
public int getMiningCapacity() {
return this.miningCapacity;
}
public float getMiningDuration() {
return this.miningDuration;
}
}

View File

@ -47,7 +47,8 @@ public final class CAbilityQueue extends AbstractCAbility {
final CPlayer player = game.getPlayer(unit.getPlayerIndex());
if (player.getGold() >= unitType.getGoldCost()) {
if (player.getLumber() >= unitType.getLumberCost()) {
if ((player.getFoodUsed() + unitType.getFoodUsed()) <= player.getFoodCap()) {
if ((unitType.getFoodUsed() == 0)
|| ((player.getFoodUsed() + unitType.getFoodUsed()) <= player.getFoodCap())) {
receiver.useOk();
}
else {

View File

@ -1,20 +1,21 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation;
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types;
import java.util.EnumSet;
import java.util.List;
import com.etheller.warsmash.util.War3ID;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType;
public class CAbilityType {
public abstract class CAbilityType<TYPE_LEVEL_DATA extends CAbilityTypeLevelData> {
/* alias: defines which ability editor ability to use */
private final War3ID alias;
/* code: defines which CAbility class to use */
private final War3ID code;
private final List<CAbilityTypeLevelData> levelData;
private final List<TYPE_LEVEL_DATA> levelData;
public CAbilityType(final War3ID alias, final War3ID code, final List<CAbilityTypeLevelData> levelData) {
public CAbilityType(final War3ID alias, final War3ID code, final List<TYPE_LEVEL_DATA> levelData) {
this.alias = alias;
this.code = code;
this.levelData = levelData;
@ -32,8 +33,10 @@ public class CAbilityType {
return getLevelData(level).getTargetsAllowed();
}
private CAbilityTypeLevelData getLevelData(final int level) {
protected final TYPE_LEVEL_DATA getLevelData(final int level) {
return this.levelData.get(level);
}
public abstract CAbility createAbility(int handleId);
}

View File

@ -1,4 +1,4 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation;
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types;
import java.util.EnumSet;

View File

@ -0,0 +1,9 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions;
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;
public interface CAbilityTypeDefinition {
CAbilityType<?> createAbilityType(War3ID rawcode, MutableGameObject abilityEditorData);
}

View File

@ -0,0 +1,31 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl;
import java.util.ArrayList;
import java.util.List;
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.CAbilityTypeLevelData;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.CAbilityTypeDefinition;
public abstract class AbstractCAbilityTypeDefinition<TYPE_LEVEL_DATA extends CAbilityTypeLevelData>
implements CAbilityTypeDefinition {
protected static final War3ID TARGETS_ALLOWED = War3ID.fromString("atar");
private static final War3ID LEVELS = War3ID.fromString("alev");
@Override
public CAbilityType<?> createAbilityType(final War3ID alias, final MutableGameObject abilityEditorData) {
final int levels = abilityEditorData.getFieldAsInteger(LEVELS, 0);
final List<TYPE_LEVEL_DATA> levelData = new ArrayList<>();
for (int level = 0; level < levels; level++) {
levelData.add(createLevelData(abilityEditorData, level));
}
return innerCreateAbilityType(alias, abilityEditorData, levelData);
}
protected abstract TYPE_LEVEL_DATA createLevelData(MutableGameObject abilityEditorData, int level);
protected abstract CAbilityType<?> innerCreateAbilityType(War3ID alias, MutableGameObject abilityEditorData,
List<TYPE_LEVEL_DATA> levelData);
}

View File

@ -0,0 +1,27 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl;
import java.util.List;
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.impl.CAbilityTypeColdArrows;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl.CAbilityTypeColdArrowsLevelData;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType;
public class CAbilityTypeDefinitionColdArrows extends AbstractCAbilityTypeDefinition<CAbilityTypeColdArrowsLevelData> {
@Override
protected CAbilityTypeColdArrowsLevelData createLevelData(final MutableGameObject abilityEditorData,
final int level) {
return new CAbilityTypeColdArrowsLevelData(
CTargetType.parseTargetTypeSet(abilityEditorData.getFieldAsString(TARGETS_ALLOWED, level)));
}
@Override
protected CAbilityType<?> innerCreateAbilityType(final War3ID alias, final MutableGameObject abilityEditorData,
final List<CAbilityTypeColdArrowsLevelData> levelData) {
return new CAbilityTypeColdArrows(alias, abilityEditorData.getCode(), levelData);
}
}

View File

@ -0,0 +1,37 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl;
import java.util.EnumSet;
import java.util.List;
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.CAbilityTypeGoldMine;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl.CAbilityTypeGoldMineLevelData;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType;
public class CAbilityTypeDefinitionGoldMine extends AbstractCAbilityTypeDefinition<CAbilityTypeGoldMineLevelData>
implements CAbilityTypeDefinition {
protected static final War3ID MAX_GOLD = War3ID.fromString("Gld1");
protected static final War3ID MINING_DURATION = War3ID.fromString("Gld2");
protected static final War3ID MINING_CAPACITY = War3ID.fromString("Gld3");
@Override
protected CAbilityTypeGoldMineLevelData createLevelData(final MutableGameObject abilityEditorData,
final int level) {
final String targetsAllowedAtLevelString = abilityEditorData.getFieldAsString(TARGETS_ALLOWED, level);
final EnumSet<CTargetType> targetsAllowedAtLevel = CTargetType.parseTargetTypeSet(targetsAllowedAtLevelString);
final int maxGold = abilityEditorData.getFieldAsInteger(MAX_GOLD, level);
final float miningDuration = abilityEditorData.getFieldAsFloat(MINING_DURATION, level);
final int miningCapacity = abilityEditorData.getFieldAsInteger(MINING_CAPACITY, level);
return new CAbilityTypeGoldMineLevelData(targetsAllowedAtLevel, maxGold, miningDuration, miningCapacity);
}
@Override
protected CAbilityType<?> innerCreateAbilityType(final War3ID alias, final MutableGameObject abilityEditorData,
final List<CAbilityTypeGoldMineLevelData> levelData) {
return new CAbilityTypeGoldMine(alias, abilityEditorData.getCode(), levelData);
}
}

View File

@ -0,0 +1,22 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl;
import java.util.List;
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.combat.CAbilityColdArrows;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.CAbilityType;
public class CAbilityTypeColdArrows extends CAbilityType<CAbilityTypeColdArrowsLevelData> {
public CAbilityTypeColdArrows(final War3ID alias, final War3ID code,
final List<CAbilityTypeColdArrowsLevelData> levelData) {
super(alias, code, levelData);
}
@Override
public CAbility createAbility(final int handleId) {
return new CAbilityColdArrows(getAlias(), handleId);
}
}

View File

@ -0,0 +1,14 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl;
import java.util.EnumSet;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.CAbilityTypeLevelData;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType;
public class CAbilityTypeColdArrowsLevelData extends CAbilityTypeLevelData {
public CAbilityTypeColdArrowsLevelData(final EnumSet<CTargetType> targetsAllowed) {
super(targetsAllowed);
}
}

View File

@ -0,0 +1,24 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl;
import java.util.List;
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.mine.CAbilityGoldMine;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.CAbilityType;
public class CAbilityTypeGoldMine extends CAbilityType<CAbilityTypeGoldMineLevelData> {
public CAbilityTypeGoldMine(final War3ID alias, final War3ID code,
final List<CAbilityTypeGoldMineLevelData> levelData) {
super(alias, code, levelData);
}
@Override
public CAbility createAbility(final int handleId) {
final CAbilityTypeGoldMineLevelData levelData = getLevelData(0);
return new CAbilityGoldMine(handleId, getAlias(), levelData.getMaxGold(), levelData.getMiningDuration(),
levelData.getMiningCapacity());
}
}

View File

@ -0,0 +1,32 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl;
import java.util.EnumSet;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.CAbilityTypeLevelData;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType;
public class CAbilityTypeGoldMineLevelData extends CAbilityTypeLevelData {
private final int maxGold;
private final float miningDuration;
private final int miningCapacity;
public CAbilityTypeGoldMineLevelData(final EnumSet<CTargetType> targetsAllowed, final int maxGold,
final float miningDuration, final int miningCapacity) {
super(targetsAllowed);
this.maxGold = maxGold;
this.miningDuration = miningDuration;
this.miningCapacity = miningCapacity;
}
public int getMaxGold() {
return this.maxGold;
}
public float getMiningDuration() {
return this.miningDuration;
}
public int getMiningCapacity() {
return this.miningCapacity;
}
}

View File

@ -12,6 +12,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAb
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAbilityOrcBuild;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAbilityUndeadBuild;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.combat.CAbilityColdArrows;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericNoIconAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericSingleIconActiveAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityQueue;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityRally;
@ -117,4 +118,11 @@ public class AbilityDisableWhileUnderConstructionVisitor implements CAbilityVisi
return null;
}
@Override
public Void accept(final GenericNoIconAbility ability) {
ability.setDisabled(false);
ability.setIconShowing(false);
return null;
}
}

View File

@ -1,55 +1,50 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.data;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.etheller.warsmash.units.manager.MutableObjectData;
import com.etheller.warsmash.units.manager.MutableObjectData.MutableGameObject;
import com.etheller.warsmash.util.War3ID;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CAbilityType;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CAbilityTypeLevelData;
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.combat.CAbilityColdArrows;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType;
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.CAbilityTypeDefinitionColdArrows;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl.CAbilityTypeDefinitionGoldMine;
public class CAbilityData {
private static final War3ID TARGETS_ALLOWED = War3ID.fromString("atar");
private static final War3ID LEVELS = War3ID.fromString("alev");
private static final War3ID COLD_ARROWS = War3ID.fromString("ACcw");
private final MutableObjectData abilityData;
private Map<War3ID, CAbilityType> aliasToAbilityType = new HashMap<>();
private Map<War3ID, CAbilityType<?>> aliasToAbilityType = new HashMap<>();
private final Map<War3ID, CAbilityTypeDefinition> codeToAbilityTypeDefinition = new HashMap<>();
public CAbilityData(final MutableObjectData abilityData) {
this.abilityData = abilityData;
this.aliasToAbilityType = new HashMap<>();
}
public CAbilityType getAbilityType(final War3ID alias) {
CAbilityType abilityType = this.aliasToAbilityType.get(alias);
private void registerCodes() {
this.codeToAbilityTypeDefinition.put(War3ID.fromString("ACcw"), new CAbilityTypeDefinitionColdArrows());
this.codeToAbilityTypeDefinition.put(War3ID.fromString("Agld"), new CAbilityTypeDefinitionGoldMine());
}
public CAbilityType<?> getAbilityType(final War3ID alias) {
CAbilityType<?> abilityType = this.aliasToAbilityType.get(alias);
if (abilityType == null) {
final MutableGameObject mutableGameObject = this.abilityData.get(alias);
final int levels = mutableGameObject.getFieldAsInteger(LEVELS, 0);
final List<CAbilityTypeLevelData> levelData = new ArrayList<>();
for (int level = 0; level < levels; level++) {
final String targetsAllowedAtLevelString = mutableGameObject.getFieldAsString(TARGETS_ALLOWED, level);
final EnumSet<CTargetType> targetsAllowedAtLevel = CTargetType
.parseTargetTypeSet(targetsAllowedAtLevelString);
levelData.add(new CAbilityTypeLevelData(targetsAllowedAtLevel));
}
abilityType = new CAbilityType(alias, mutableGameObject.getCode(), levelData);
final War3ID code = mutableGameObject.getCode();
final CAbilityTypeDefinition abilityTypeDefinition = this.codeToAbilityTypeDefinition.get(code);
abilityType = abilityTypeDefinition.createAbilityType(alias, mutableGameObject);
}
return abilityType;
}
public CAbility createAbility(final String ability, final int handleId) {
final War3ID war3Id = War3ID.fromString(ability);
if (war3Id.equals(COLD_ARROWS)) {
return new CAbilityColdArrows(war3Id, handleId);
final CAbilityType<?> abilityType = getAbilityType(war3Id);
if (abilityType != null) {
return abilityType.createAbility(handleId);
}
return new CAbilityGeneric(war3Id, handleId);
}

View File

@ -7,6 +7,8 @@ public interface AbilityTargetCheckReceiver<TARGET_TYPE> {
void mustTargetType(TargetType correctType);
void mustTargetResources();
void targetOutsideRange(double howMuch);
void notAnActiveAbility();
@ -29,6 +31,6 @@ public interface AbilityTargetCheckReceiver<TARGET_TYPE> {
UNIT,
POINT,
UNIT_OR_POINT,
NO_TARGET,
NO_TARGET
}
}

View File

@ -33,6 +33,11 @@ public final class BooleanAbilityTargetCheckReceiver<TARGET_TYPE> implements Abi
this.targetable = false;
}
@Override
public void mustTargetResources() {
this.targetable = false;
}
@Override
public void targetOutsideRange(final double howMuch) {
this.targetable = false;

View File

@ -20,7 +20,11 @@ public class CWidgetAbilityTargetCheckReceiver implements AbilityTargetCheckRece
@Override
public void mustTargetType(final TargetType correctType) {
this.target = null;
}
@Override
public void mustTargetResources() {
this.target = null;
}
@Override

View File

@ -22,6 +22,11 @@ public class PointAbilityTargetCheckReceiver implements AbilityTargetCheckReceiv
this.target = null;
}
@Override
public void mustTargetResources() {
this.target = null;
}
@Override
public void targetOutsideRange(final double howMuch) {
this.target = null;

View File

@ -63,6 +63,11 @@ public final class StringMsgTargetCheckReceiver<TARGET_TYPE> implements AbilityT
}
}
@Override
public void mustTargetResources() {
this.message = "NOTEXTERN: Must target resources.";
}
@Override
public void targetOutsideRange(final double howMuch) {
this.message = "NOTEXTERN: Target is outside range.";

View File

@ -101,6 +101,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAb
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAbilityOrcBuild;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.build.CAbilityUndeadBuild;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.combat.CAbilityColdArrows;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericNoIconAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericSingleIconActiveAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityQueue;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityRally;
@ -318,29 +319,35 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma
final CRace race = this.localPlayer.getRace();
final int racialSkinIndex;
int racialCommandIndex;
switch (race) {
case HUMAN:
if (race == null) {
racialSkinIndex = 1;
racialCommandIndex = 0;
break;
case ORC:
racialSkinIndex = 0;
racialCommandIndex = 1;
break;
case NIGHTELF:
racialSkinIndex = 2;
racialCommandIndex = 3;
break;
case UNDEAD:
racialSkinIndex = 3;
racialCommandIndex = 2;
break;
case DEMON:
case OTHER:
default:
racialSkinIndex = -1;
racialCommandIndex = 0;
break;
}
else {
switch (race) {
case HUMAN:
racialSkinIndex = 1;
racialCommandIndex = 0;
break;
case ORC:
racialSkinIndex = 0;
racialCommandIndex = 1;
break;
case NIGHTELF:
racialSkinIndex = 2;
racialCommandIndex = 3;
break;
case UNDEAD:
racialSkinIndex = 3;
racialCommandIndex = 2;
break;
case DEMON:
case OTHER:
default:
racialSkinIndex = -1;
racialCommandIndex = 0;
break;
}
}
this.rootFrame = new GameUI(this.dataSource, GameUI.loadSkin(this.dataSource, racialSkinIndex), this.uiViewport,
this.fontGenerator, this.uiScene, this.war3MapViewer, racialCommandIndex);
@ -922,6 +929,13 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma
return null;
}
@Override
public Void accept(final GenericNoIconAbility ability) {
// this should probably never happen
handleTargetCursor(ability);
return null;
}
@Override
public Void accept(final CAbilityRally ability) {
handleTargetCursor(ability);