Working with jass abilities for fun

This commit is contained in:
Retera 2022-06-04 06:02:54 -04:00
parent c5b61afa28
commit 0a6fdba9da
28 changed files with 1845 additions and 68 deletions

View File

@ -208,7 +208,7 @@ public class WarsmashGdxMapScreen implements InputProcessor, Screen {
throw new RuntimeException(e);
}
this.commonEnv = Jass2.loadCommon(this.viewer.mapMpq, this.uiViewport, this.uiScene, this.viewer, this.meleeUI,
"Scripts\\common.j", "Scripts\\Blizzard.j", "Scripts\\war3map.j");
"Scripts\\common.j", "Scripts\\abilitiesCommon.j", "Scripts\\Blizzard.j", "Scripts\\war3map.j");
this.commonEnv.main();
}

View File

@ -88,7 +88,12 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.inventory
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.mine.CAbilityBlightedGoldMine;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityPointTarget;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.CAbilityType;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass.BehaviorExpr;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass.CAbilityTypeJassDefinition;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass.CAbilityTypeJassDefinition.JassOrder;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass.CAbilityTypeJassDefinition.JassOrderCommandCardType;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.ai.AIDifficulty;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.behaviors.CBehaviorAttackListener;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.config.CPlayerAPI;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.config.War3MapConfig;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.item.CItemTypeJass;
@ -605,6 +610,13 @@ public class Jass2 {
final HandleJassType hashtableType = globals.registerHandleType("hashtable");
final HandleJassType frameHandleType = globals.registerHandleType("framehandle");
// Warsmash Ability API
final HandleJassType abilitytypeType = globals.registerHandleType("abilitytype");
final HandleJassType ordercommandcardType = globals.registerHandleType("ordercommandcard");
final HandleJassType ordercommandcardtypeType = globals.registerHandleType("ordercommandcardtype");
final HandleJassType abilitybehaviorType = globals.registerHandleType("abilitybehavior");
final HandleJassType behaviorexprType = globals.registerHandleType("behaviorexpr");
registerTypingNatives(jassProgramVisitor, raceType, alliancetypeType, racepreferenceType, igamestateType,
fgamestateType, playerstateType, playerscoreType, playergameresultType, unitstateType,
aidifficultyType, gameeventType, playereventType, playeruniteventType, uniteventType, limitopType,
@ -613,6 +625,15 @@ public class Jass2 {
volumegroupType, camerafieldType, playercolorType, placementType, startlocprioType,
raritycontrolType, blendmodeType, texmapflagsType, effecttypeType, fogstateType, versionType,
itemtypeType, attacktypeType, damagetypeType, weapontypeType, soundtypeType, pathingtypeType);
jassProgramVisitor.getJassNativeManager().createNative("ConvertOrderCommandCardType", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final int i = arguments.get(0).visit(IntegerJassValueVisitor.getInstance());
return new HandleJassValue(ordercommandcardtypeType, JassOrderCommandCardType.VALUES[i]);
}
});
jassProgramVisitor.getJassNativeManager().createNative("UnitId", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
@ -3377,6 +3398,7 @@ public class Jass2 {
final TriggerExecutionScope triggerScope) {
final CUnit whichUnit = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
CommonEnvironment.this.simulation.removeUnit(whichUnit);
meleeUI.removedUnit(whichUnit);
return null;
}
});
@ -3874,6 +3896,568 @@ public class Jass2 {
return BooleanJassValue.FALSE;
}
});
// Warsmash Ability API
jassProgramVisitor.getJassNativeManager().createNative("GetUnitMoveFollowBehavior", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CUnit unit = nullable(arguments, 0, ObjectJassValueVisitor.getInstance());
final int highlightOrderId = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
final CWidget whichFollowTarget = nullable(arguments, 2, ObjectJassValueVisitor.getInstance());
if (unit == null) {
return null;
}
return new HandleJassValue(abilitybehaviorType,
unit.getFollowBehavior().reset(highlightOrderId, whichFollowTarget));
}
});
jassProgramVisitor.getJassNativeManager().createNative("GetUnitMovePointBehavior", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CUnit unit = nullable(arguments, 0, ObjectJassValueVisitor.getInstance());
final int highlightOrderId = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
final double targetX = arguments.get(2).visit(RealJassValueVisitor.getInstance());
final double targetY = arguments.get(3).visit(RealJassValueVisitor.getInstance());
if (unit == null) {
return null;
}
return new HandleJassValue(abilitybehaviorType, unit.getMoveBehavior().reset(highlightOrderId,
new AbilityPointTarget((float) targetX, (float) targetY)));
}
});
jassProgramVisitor.getJassNativeManager().createNative("GetUnitMovePointBehaviorLoc", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CUnit unit = nullable(arguments, 0, ObjectJassValueVisitor.getInstance());
final int highlightOrderId = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
final Point2D.Double target = arguments.get(2).visit(ObjectJassValueVisitor.getInstance());
if (unit == null) {
return null;
}
return new HandleJassValue(abilitybehaviorType, unit.getMoveBehavior().reset(highlightOrderId,
new AbilityPointTarget((float) target.x, (float) target.y)));
}
});
jassProgramVisitor.getJassNativeManager().createNative("GetUnitAttackMovePointBehavior",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CUnit unit = nullable(arguments, 0, ObjectJassValueVisitor.getInstance());
final double targetX = arguments.get(1).visit(RealJassValueVisitor.getInstance());
final double targetY = arguments.get(2).visit(RealJassValueVisitor.getInstance());
if (unit == null) {
return null;
}
return new HandleJassValue(abilitybehaviorType, unit.getAttackMoveBehavior()
.reset(new AbilityPointTarget((float) targetX, (float) targetY)));
}
});
jassProgramVisitor.getJassNativeManager().createNative("GetUnitAttackMovePointBehaviorLoc",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CUnit unit = nullable(arguments, 0, ObjectJassValueVisitor.getInstance());
final Point2D.Double target = arguments.get(1).visit(ObjectJassValueVisitor.getInstance());
if (unit == null) {
return null;
}
return new HandleJassValue(abilitybehaviorType, unit.getAttackMoveBehavior()
.reset(new AbilityPointTarget((float) target.x, (float) target.y)));
}
});
jassProgramVisitor.getJassNativeManager().createNative("GetUnitAttackWidgetBehavior", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CUnit unit = nullable(arguments, 0, ObjectJassValueVisitor.getInstance());
final int highlightOrderId = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
final int whichUnitAttackIndex = arguments.get(2).visit(IntegerJassValueVisitor.getInstance());
final CWidget target = nullable(arguments, 3, ObjectJassValueVisitor.getInstance());
if (unit == null) {
return null;
}
return new HandleJassValue(abilitybehaviorType,
unit.getAttackBehavior().reset(highlightOrderId,
unit.getAttacks().get(whichUnitAttackIndex), target, false,
CBehaviorAttackListener.DO_NOTHING));
}
});
jassProgramVisitor.getJassNativeManager().createNative("GetUnitAttackGroundBehavior", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CUnit unit = nullable(arguments, 0, ObjectJassValueVisitor.getInstance());
final int highlightOrderId = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
final int whichUnitAttackIndex = arguments.get(2).visit(IntegerJassValueVisitor.getInstance());
final double targetX = arguments.get(3).visit(RealJassValueVisitor.getInstance());
final double targetY = arguments.get(4).visit(RealJassValueVisitor.getInstance());
if (unit == null) {
return null;
}
return new HandleJassValue(abilitybehaviorType,
unit.getAttackBehavior().reset(highlightOrderId,
unit.getAttacks().get(whichUnitAttackIndex),
new AbilityPointTarget((float) targetX, (float) targetY), false,
CBehaviorAttackListener.DO_NOTHING));
}
});
jassProgramVisitor.getJassNativeManager().createNative("GetUnitAttackGroundBehaviorLoc",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CUnit unit = nullable(arguments, 0, ObjectJassValueVisitor.getInstance());
final int highlightOrderId = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
final int whichUnitAttackIndex = arguments.get(2)
.visit(IntegerJassValueVisitor.getInstance());
final Point2D.Double target = arguments.get(3).visit(ObjectJassValueVisitor.getInstance());
if (unit == null) {
return null;
}
return new HandleJassValue(abilitybehaviorType,
unit.getAttackBehavior().reset(highlightOrderId,
unit.getAttacks().get(whichUnitAttackIndex),
new AbilityPointTarget((float) target.x, (float) target.y), false,
CBehaviorAttackListener.DO_NOTHING));
}
});
jassProgramVisitor.getJassNativeManager().createNative("CreateAbilityBehavior", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
throw new UnsupportedOperationException("NYI");
}
});
jassProgramVisitor.getJassNativeManager().createNative("GetSpellAbilityOrderId", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
return new IntegerJassValue(((CommonTriggerExecutionScope) triggerScope).getSpellAbilityOrderId());
}
});
jassProgramVisitor.getJassNativeManager().createNative("GetSpellAbilityOrderCommandCard",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
return new IntegerJassValue(
((CommonTriggerExecutionScope) triggerScope).getSpellAbilityOrderId());
}
});
jassProgramVisitor.getJassNativeManager().createNative("GetSpellTargetType", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
return new HandleJassValue(ordercommandcardtypeType,
((CommonTriggerExecutionScope) triggerScope).getSpellAbilityTargetType());
}
});
jassProgramVisitor.getJassNativeManager().createNative("CreateAbilityType", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
return new HandleJassValue(abilitytypeType, new CAbilityTypeJassDefinition(globalScope));
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetAbilityTypeOnAddAction", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition whichAbilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final JassFunction func = arguments.get(1).visit(JassFunctionJassValueVisitor.getInstance());
whichAbilityType.setOnAddJass(func);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetAbilityTypeOnRemoveAction", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition whichAbilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final JassFunction func = arguments.get(1).visit(JassFunctionJassValueVisitor.getInstance());
whichAbilityType.setOnRemoveJass(func);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetAbilityTypeOnTickAction", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition whichAbilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final JassFunction func = arguments.get(1).visit(JassFunctionJassValueVisitor.getInstance());
whichAbilityType.setOnTickJass(func);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetAbilityTypeOnDeathAction", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition whichAbilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final JassFunction func = arguments.get(1).visit(JassFunctionJassValueVisitor.getInstance());
whichAbilityType.setOnDeathJass(func);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetAbilityTypeOnCancelFromQueueAction",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition whichAbilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final JassFunction func = arguments.get(1)
.visit(JassFunctionJassValueVisitor.getInstance());
whichAbilityType.setOnCancelFromQueueJass(func);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetAbilityTypeOnCheckBeforeQueueQueueCondition",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition whichAbilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final TriggerBooleanExpression boolExpr = arguments.get(1)
.visit(ObjectJassValueVisitor.getInstance());
whichAbilityType.setCheckBeforeQueueJass(boolExpr);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetAbilityTypeCheckTargetCondition",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition whichAbilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final TriggerBooleanExpression boolExpr = arguments.get(1)
.visit(ObjectJassValueVisitor.getInstance());
whichAbilityType.setCheckTargetCondition(boolExpr);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetAbilityTypeCheckUseCondition",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition whichAbilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final TriggerBooleanExpression boolExpr = arguments.get(1)
.visit(ObjectJassValueVisitor.getInstance());
whichAbilityType.setCheckUseCondition(boolExpr);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetAbilityTypeEnabledWhileUnderConstruction",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition whichAbilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final boolean enabled = arguments.get(1).visit(BooleanJassValueVisitor.getInstance());
whichAbilityType.setEnabledWhileUnderConstruction(enabled);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetAbilityTypeEnabledWhileUpgrading",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition whichAbilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final boolean enabled = arguments.get(1).visit(BooleanJassValueVisitor.getInstance());
whichAbilityType.setEnabledWhileUpgrading(enabled);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetAbilityTypeBehavior", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition whichAbilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final BehaviorExpr expr = arguments.get(1).visit(ObjectJassValueVisitor.getInstance());
whichAbilityType.setBeginJass(expr);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("RegisterAbilityType", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final int rawcode = arguments.get(0).visit(IntegerJassValueVisitor.getInstance());
final CAbilityTypeJassDefinition whichAbilityType = nullable(arguments, 1,
ObjectJassValueVisitor.getInstance());
CommonEnvironment.this.simulation.getAbilityData().registerJassType(new War3ID(rawcode),
whichAbilityType);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("CreateOrderCommandCard", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrderCommandCardType type = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
final int orderId = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
final int buttonPositionX = arguments.get(2).visit(IntegerJassValueVisitor.getInstance());
final int buttonPositionY = arguments.get(3).visit(IntegerJassValueVisitor.getInstance());
final JassOrder javaValue = new JassOrder(orderId, buttonPositionX, buttonPositionY);
javaValue.setType(type);
return new HandleJassValue(ordercommandcardType, javaValue);
}
});
jassProgramVisitor.getJassNativeManager().createNative("AbilityTypeAddOrderCommandCard",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition abilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final JassOrder commandCard = arguments.get(1).visit(ObjectJassValueVisitor.getInstance());
abilityType.addJassOrder(commandCard);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("AbilityTypeRemoveOrderCommandCard",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final CAbilityTypeJassDefinition abilityType = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final JassOrder commandCard = arguments.get(1).visit(ObjectJassValueVisitor.getInstance());
abilityType.removeJassOrder(commandCard);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardAutoCastOrderId",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final int autoCastOrderId = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
orderCommandCard.setAutoCastOrderId(autoCastOrderId);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardUnAutoCastOrderId",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final int autoCastUnOrderId = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
orderCommandCard.setAutoCastUnOrderId(autoCastUnOrderId);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardContainerMenuOrderId",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final int orderId = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
orderCommandCard.setContainerMenuOrderId(orderId);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardDisabled", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
final boolean disabled = arguments.get(1).visit(BooleanJassValueVisitor.getInstance());
orderCommandCard.setDisabled(disabled);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardManaCost", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
final int manaCost = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
orderCommandCard.setManaCost(manaCost);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardGoldCost", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
final int goldCost = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
orderCommandCard.setGoldCost(goldCost);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardLumberCost", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
final int lumberCost = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
orderCommandCard.setLumberCost(lumberCost);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardFoodCostDisplayOnly",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final int foodCost = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
orderCommandCard.setFoodCostDisplayOnly(foodCost);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardCharges", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
final int charges = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
orderCommandCard.setCharges(charges);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardAutoCastActive",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final boolean active = arguments.get(1).visit(BooleanJassValueVisitor.getInstance());
orderCommandCard.setAutoCastActive(active);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardHidden", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
final boolean hidden = arguments.get(1).visit(BooleanJassValueVisitor.getInstance());
orderCommandCard.setHidden(hidden);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardIconPath", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
final String iconPath = arguments.get(1).visit(StringJassValueVisitor.getInstance());
orderCommandCard.setIconPath(iconPath);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardButtonPositionX",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final int buttonPosX = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
orderCommandCard.setButtonPositionX(buttonPosX);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardButtonPositionY",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final int buttonPosY = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
orderCommandCard.setButtonPositionY(buttonPosY);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardToolTip", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
final String tip = arguments.get(1).visit(StringJassValueVisitor.getInstance());
orderCommandCard.setTip(tip);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardUberTip", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
final String uberTip = arguments.get(1).visit(StringJassValueVisitor.getInstance());
orderCommandCard.setUberTip(uberTip);
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardHotKey", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
final String hotkeyString = arguments.get(1).visit(StringJassValueVisitor.getInstance());
orderCommandCard.setHotkey(hotkeyString.charAt(0));
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardPreviewBuildUnitId",
new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0)
.visit(ObjectJassValueVisitor.getInstance());
final int unitId = arguments.get(1).visit(IntegerJassValueVisitor.getInstance());
orderCommandCard.setPreviewBuildUnitId(new War3ID(unitId));
return null;
}
});
jassProgramVisitor.getJassNativeManager().createNative("SetOrderCommandCardAOE", new JassFunction() {
@Override
public JassValue call(final List<JassValue> arguments, final GlobalScope globalScope,
final TriggerExecutionScope triggerScope) {
final JassOrder orderCommandCard = arguments.get(0).visit(ObjectJassValueVisitor.getInstance());
final double radius = arguments.get(1).visit(RealJassValueVisitor.getInstance());
orderCommandCard.setMouseTargetRadius((float) radius);
return null;
}
});
}
public void config() {
@ -4013,6 +4597,13 @@ public class Jass2 {
final HandleJassType hashtableType = globals.registerHandleType("hashtable");
final HandleJassType frameHandleType = globals.registerHandleType("framehandle");
// Warsmash Ability API
final HandleJassType abilitytypeType = globals.registerHandleType("abilitytype");
final HandleJassType ordercommandcardType = globals.registerHandleType("ordercommandcard");
final HandleJassType ordercommandcardtypeType = globals.registerHandleType("ordercommandcardtype");
final HandleJassType abilitybehaviorType = globals.registerHandleType("abilitybehavior");
final HandleJassType behaviorexprType = globals.registerHandleType("behaviorexpr");
registerTypingNatives(jassProgramVisitor, raceType, alliancetypeType, racepreferenceType, igamestateType,
fgamestateType, playerstateType, playerscoreType, playergameresultType, unitstateType,
aidifficultyType, gameeventType, playereventType, playeruniteventType, uniteventType, limitopType,

View File

@ -7,7 +7,10 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CDestructable;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CItem;
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.CAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityPointTarget;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass.CAbilityTypeJassDefinition.JassOrder;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass.CAbilityTypeJassDefinition.JassOrderCommandCardType;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.players.CPlayerJass;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.region.CRegion;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.timers.CTimerJass;
@ -72,10 +75,17 @@ public class CommonTriggerExecutionScope extends TriggerExecutionScope {
private CWidget triggerWidget;
private CScriptDialog clickedDialog;
private CScriptDialogButton clickedButton;
private CAbility spellAbility;
private CUnit spellAbilityUnit;
private CUnit spellTargetUnit;
private CDestructable spellTargetDestructable;
private CItem spellTargetItem;
private AbilityPointTarget spellTargetPoint;
private War3ID spellAbilityId;
private int spellAbilityOrderId; // Warsmash only
private JassOrderCommandCardType spellAbilityTargetType; // Warsmash only
private JassOrder spellAbilityOrderCommandCard; // Warsmash only
private JassGameEventsWar3 triggerEventId;
public CommonTriggerExecutionScope(final Trigger triggeringTrigger) {
@ -397,6 +407,18 @@ public class CommonTriggerExecutionScope extends TriggerExecutionScope {
return this.spellAbilityId;
}
public int getSpellAbilityOrderId() {
return this.spellAbilityOrderId;
}
public JassOrderCommandCardType getSpellAbilityTargetType() {
return this.spellAbilityTargetType;
}
public JassOrder getSpellAbilityOrderCommandCard() {
return this.spellAbilityOrderCommandCard;
}
public static CommonTriggerExecutionScope filterScope(final TriggerExecutionScope parentScope,
final CUnit filterUnit) {
final CommonTriggerExecutionScope scope = new CommonTriggerExecutionScope(parentScope.getTriggeringTrigger(),
@ -534,8 +556,10 @@ public class CommonTriggerExecutionScope extends TriggerExecutionScope {
}
public static CommonTriggerExecutionScope unitSpellEffectTargetScope(final JassGameEventsWar3 triggerEventId,
final Trigger trigger, final CUnit spellAbilityUnit, final CUnit targetUnit, final War3ID spellAbilityId) {
final Trigger trigger, final CAbility spellAbility, final CUnit spellAbilityUnit, final CUnit targetUnit,
final War3ID spellAbilityId) {
final CommonTriggerExecutionScope scope = new CommonTriggerExecutionScope(trigger, TriggerExecutionScope.EMPTY);
scope.spellAbility = spellAbility;
scope.spellAbilityUnit = spellAbilityUnit;
scope.triggeringUnit = spellAbilityUnit;
scope.spellTargetUnit = targetUnit;
@ -545,9 +569,10 @@ public class CommonTriggerExecutionScope extends TriggerExecutionScope {
}
public static CommonTriggerExecutionScope unitSpellEffectPointScope(final JassGameEventsWar3 triggerEventId,
final Trigger trigger, final CUnit spellAbilityUnit, final AbilityPointTarget targetPoint,
final War3ID spellAbilityId) {
final Trigger trigger, final CAbility spellAbility, final CUnit spellAbilityUnit,
final AbilityPointTarget targetPoint, final War3ID spellAbilityId) {
final CommonTriggerExecutionScope scope = new CommonTriggerExecutionScope(trigger, TriggerExecutionScope.EMPTY);
scope.spellAbility = spellAbility;
scope.spellAbilityUnit = spellAbilityUnit;
scope.triggeringUnit = spellAbilityUnit;
scope.spellTargetPoint = targetPoint;
@ -556,6 +581,115 @@ public class CommonTriggerExecutionScope extends TriggerExecutionScope {
return scope;
}
public static CommonTriggerExecutionScope jassAbilityTargetScope(final CAbility spellAbility,
final CUnit spellAbilityUnit, final CUnit targetUnit, final War3ID spellAbilityId,
final int spellAbilityOrderId, final JassOrderCommandCardType spellAbilityTargetType,
final JassOrder spellAbilityOrderCommandCard) {
final CommonTriggerExecutionScope scope = new CommonTriggerExecutionScope(null, TriggerExecutionScope.EMPTY);
scope.spellAbility = spellAbility;
scope.spellAbilityUnit = spellAbilityUnit;
scope.triggeringUnit = spellAbilityUnit;
scope.spellTargetUnit = targetUnit;
scope.spellAbilityId = spellAbilityId;
scope.spellAbilityOrderId = spellAbilityOrderId;
scope.spellAbilityTargetType = spellAbilityTargetType;
return scope;
}
public static CommonTriggerExecutionScope jassAbilityTargetScope(final CAbility spellAbility,
final CUnit spellAbilityUnit, final CItem targetItem, final War3ID spellAbilityId,
final int spellAbilityOrderId, final JassOrderCommandCardType spellAbilityTargetType,
final JassOrder spellAbilityOrderCommandCard) {
final CommonTriggerExecutionScope scope = new CommonTriggerExecutionScope(null, TriggerExecutionScope.EMPTY);
scope.spellAbility = spellAbility;
scope.spellAbilityUnit = spellAbilityUnit;
scope.triggeringUnit = spellAbilityUnit;
scope.spellTargetItem = targetItem;
scope.spellAbilityId = spellAbilityId;
scope.spellAbilityOrderId = spellAbilityOrderId;
scope.spellAbilityTargetType = spellAbilityTargetType;
return scope;
}
public static CommonTriggerExecutionScope jassAbilityTargetScope(final CAbility spellAbility,
final CUnit spellAbilityUnit, final CDestructable targetDestructable, final War3ID spellAbilityId,
final int spellAbilityOrderId, final JassOrderCommandCardType spellAbilityTargetType,
final JassOrder spellAbilityOrderCommandCard) {
final CommonTriggerExecutionScope scope = new CommonTriggerExecutionScope(null, TriggerExecutionScope.EMPTY);
scope.spellAbility = spellAbility;
scope.spellAbilityUnit = spellAbilityUnit;
scope.triggeringUnit = spellAbilityUnit;
scope.spellTargetDestructable = targetDestructable;
scope.spellAbilityId = spellAbilityId;
scope.spellAbilityOrderId = spellAbilityOrderId;
scope.spellAbilityTargetType = spellAbilityTargetType;
return scope;
}
public static CommonTriggerExecutionScope jassAbilityPointScope(final CAbility spellAbility,
final CUnit spellAbilityUnit, final AbilityPointTarget targetPoint, final War3ID spellAbilityId,
final int spellAbilityOrderId, final JassOrderCommandCardType spellAbilityTargetType,
final JassOrder spellAbilityOrderCommandCard) {
final CommonTriggerExecutionScope scope = new CommonTriggerExecutionScope(null, TriggerExecutionScope.EMPTY);
scope.spellAbility = spellAbility;
scope.spellAbilityUnit = spellAbilityUnit;
scope.triggeringUnit = spellAbilityUnit;
scope.spellTargetPoint = targetPoint;
scope.spellAbilityId = spellAbilityId;
scope.spellAbilityOrderId = spellAbilityOrderId;
scope.spellAbilityTargetType = spellAbilityTargetType;
return scope;
}
public static CommonTriggerExecutionScope jassAbilityNoTargetScope(final CAbility spellAbility,
final CUnit spellAbilityUnit, final War3ID spellAbilityId, final int spellAbilityOrderId,
final JassOrderCommandCardType spellAbilityTargetType, final JassOrder spellAbilityOrderCommandCard) {
final CommonTriggerExecutionScope scope = new CommonTriggerExecutionScope(null, TriggerExecutionScope.EMPTY);
scope.spellAbility = spellAbility;
scope.spellAbilityUnit = spellAbilityUnit;
scope.triggeringUnit = spellAbilityUnit;
scope.spellAbilityId = spellAbilityId;
scope.spellAbilityOrderId = spellAbilityOrderId;
scope.spellAbilityTargetType = spellAbilityTargetType;
scope.spellAbilityOrderCommandCard = spellAbilityOrderCommandCard;
return scope;
}
public static CommonTriggerExecutionScope jassAbilityBasicScope(final CAbility spellAbility,
final CUnit spellAbilityUnit, final War3ID spellAbilityId) {
final CommonTriggerExecutionScope scope = new CommonTriggerExecutionScope(null, TriggerExecutionScope.EMPTY);
scope.spellAbility = spellAbility;
scope.spellAbilityUnit = spellAbilityUnit;
scope.triggeringUnit = spellAbilityUnit;
scope.spellAbilityId = spellAbilityId;
return scope;
}
public static CommonTriggerExecutionScope jassAbilityBasicScope(final CAbility spellAbility,
final CUnit spellAbilityUnit, final War3ID spellAbilityId, final int spellAbilityOrderId) {
final CommonTriggerExecutionScope scope = new CommonTriggerExecutionScope(null, TriggerExecutionScope.EMPTY);
scope.spellAbility = spellAbility;
scope.spellAbilityUnit = spellAbilityUnit;
scope.triggeringUnit = spellAbilityUnit;
scope.spellAbilityId = spellAbilityId;
scope.spellAbilityOrderId = spellAbilityOrderId;
return scope;
}
public static CommonTriggerExecutionScope jassAbilityBasicScope(final CAbility spellAbility,
final CUnit spellAbilityUnit, final War3ID spellAbilityId, final int spellAbilityOrderId,
final JassOrderCommandCardType spellAbilityTargetType, final JassOrder spellAbilityOrderCommandCard) {
final CommonTriggerExecutionScope scope = new CommonTriggerExecutionScope(null, TriggerExecutionScope.EMPTY);
scope.spellAbility = spellAbility;
scope.spellAbilityUnit = spellAbilityUnit;
scope.triggeringUnit = spellAbilityUnit;
scope.spellAbilityId = spellAbilityId;
scope.spellAbilityOrderId = spellAbilityOrderId;
scope.spellAbilityTargetType = spellAbilityTargetType;
scope.spellAbilityOrderCommandCard = spellAbilityOrderCommandCard;
return scope;
}
public static interface UnitEventScopeBuilder {
CommonTriggerExecutionScope create(JassGameEventsWar3 triggerEventId, Trigger trigger, CUnit unit);
}

View File

@ -92,11 +92,12 @@ public class AbilityDataUI {
private final IconUI cancelTrainUI;
private final IconUI rallyUI;
private final IconUI selectSkillUI;
private final String disabledPrefix;
public AbilityDataUI(final MutableObjectData abilityData, final MutableObjectData unitData,
final MutableObjectData itemData, final MutableObjectData upgradeData, final GameUI gameUI,
final War3MapViewer viewer) {
final String disabledPrefix = gameUI.getSkinField("CommandButtonDisabledArtPath");
this.disabledPrefix = gameUI.getSkinField("CommandButtonDisabledArtPath");
for (final War3ID alias : abilityData.keySet()) {
final MutableGameObject abilityTypeData = abilityData.get(alias);
final String iconResearchPath = gameUI.trySkinField(abilityTypeData.getFieldAsString(ICON_RESEARCH, 0));
@ -118,11 +119,11 @@ public class AbilityDataUI {
final int iconTurnOffX = abilityTypeData.getFieldAsInteger(ICON_TURN_OFF_X, 0);
final int iconTurnOffY = abilityTypeData.getFieldAsInteger(ICON_TURN_OFF_Y, 0);
final Texture iconResearch = gameUI.loadTexture(iconResearchPath);
final Texture iconResearchDisabled = gameUI.loadTexture(disable(iconResearchPath, disabledPrefix));
final Texture iconResearchDisabled = gameUI.loadTexture(disable(iconResearchPath, this.disabledPrefix));
final Texture iconNormal = gameUI.loadTexture(iconNormalPath);
final Texture iconNormalDisabled = gameUI.loadTexture(disable(iconNormalPath, disabledPrefix));
final Texture iconNormalDisabled = gameUI.loadTexture(disable(iconNormalPath, this.disabledPrefix));
final Texture iconTurnOff = gameUI.loadTexture(iconTurnOffPath);
final Texture iconTurnOffDisabled = gameUI.loadTexture(disable(iconTurnOffPath, disabledPrefix));
final Texture iconTurnOffDisabled = gameUI.loadTexture(disable(iconTurnOffPath, this.disabledPrefix));
final List<String> casterArt = Arrays.asList(abilityTypeData.getFieldAsString(CASTER_ART, 0).split(","));
final List<String> targetArt = Arrays.asList(abilityTypeData.getFieldAsString(TARGET_ART, 0).split(","));
@ -157,7 +158,7 @@ public class AbilityDataUI {
final String iconUberTip = abilityTypeData.getFieldAsString(UNIT_UBER_TIP, 0);
final char iconHotkey = getHotkey(abilityTypeData, UNIT_HOTKEY);
final Texture iconNormal = gameUI.loadTexture(iconNormalPath);
final Texture iconNormalDisabled = gameUI.loadTexture(disable(iconNormalPath, disabledPrefix));
final Texture iconNormalDisabled = gameUI.loadTexture(disable(iconNormalPath, this.disabledPrefix));
this.rawcodeToUnitUI.put(alias, new UnitIconUI(iconNormal, iconNormalDisabled, iconNormalX, iconNormalY,
iconTip, iconUberTip, iconHotkey, reviveTip, awakenTip));
}
@ -171,7 +172,7 @@ public class AbilityDataUI {
final String iconDescription = abilityTypeData.getFieldAsString(ITEM_DESCRIPTION, 0);
final char iconHotkey = getHotkey(abilityTypeData, ITEM_HOTKEY);
final Texture iconNormal = gameUI.loadTexture(iconNormalPath);
final Texture iconNormalDisabled = gameUI.loadTexture(disable(iconNormalPath, disabledPrefix));
final Texture iconNormalDisabled = gameUI.loadTexture(disable(iconNormalPath, this.disabledPrefix));
this.rawcodeToItemUI
.put(alias,
new ItemUI(
@ -192,29 +193,29 @@ public class AbilityDataUI {
.trySkinField(upgradeTypeData.getFieldAsString(UPGRADE_ICON_NORMAL, i));
final char iconHotkey = getHotkey(upgradeTypeData, UPGRADE_HOTKEY, i);
final Texture iconNormal = gameUI.loadTexture(iconNormalPath);
final Texture iconNormalDisabled = gameUI.loadTexture(disable(iconNormalPath, disabledPrefix));
final Texture iconNormalDisabled = gameUI.loadTexture(disable(iconNormalPath, this.disabledPrefix));
upgradeIconsByLevel.add(new IconUI(iconNormal, iconNormalDisabled, iconNormalX, iconNormalY, iconTip,
iconUberTip, iconHotkey));
}
this.rawcodeToUpgradeUI.put(alias, upgradeIconsByLevel);
}
this.moveUI = createBuiltInIconUI(gameUI, "CmdMove", disabledPrefix);
this.stopUI = createBuiltInIconUI(gameUI, "CmdStop", disabledPrefix);
this.holdPosUI = createBuiltInIconUI(gameUI, "CmdHoldPos", disabledPrefix);
this.patrolUI = createBuiltInIconUI(gameUI, "CmdPatrol", disabledPrefix);
this.attackUI = createBuiltInIconUI(gameUI, "CmdAttack", disabledPrefix);
this.buildHumanUI = createBuiltInIconUI(gameUI, "CmdBuildHuman", disabledPrefix);
this.buildOrcUI = createBuiltInIconUI(gameUI, "CmdBuildOrc", disabledPrefix);
this.buildNightElfUI = createBuiltInIconUI(gameUI, "CmdBuildNightElf", disabledPrefix);
this.buildUndeadUI = createBuiltInIconUI(gameUI, "CmdBuildUndead", disabledPrefix);
this.buildNagaUI = createBuiltInIconUI(gameUI, "CmdBuildNaga", disabledPrefix);
this.buildNeutralUI = createBuiltInIconUI(gameUI, "CmdBuild", disabledPrefix);
this.attackGroundUI = createBuiltInIconUI(gameUI, "CmdAttackGround", disabledPrefix);
this.cancelUI = createBuiltInIconUI(gameUI, "CmdCancel", disabledPrefix);
this.cancelBuildUI = createBuiltInIconUI(gameUI, "CmdCancelBuild", disabledPrefix);
this.cancelTrainUI = createBuiltInIconUI(gameUI, "CmdCancelTrain", disabledPrefix);
this.rallyUI = createBuiltInIconUI(gameUI, "CmdRally", disabledPrefix);
this.selectSkillUI = createBuiltInIconUI(gameUI, "CmdSelectSkill", disabledPrefix);
this.moveUI = createBuiltInIconUI(gameUI, "CmdMove", this.disabledPrefix);
this.stopUI = createBuiltInIconUI(gameUI, "CmdStop", this.disabledPrefix);
this.holdPosUI = createBuiltInIconUI(gameUI, "CmdHoldPos", this.disabledPrefix);
this.patrolUI = createBuiltInIconUI(gameUI, "CmdPatrol", this.disabledPrefix);
this.attackUI = createBuiltInIconUI(gameUI, "CmdAttack", this.disabledPrefix);
this.buildHumanUI = createBuiltInIconUI(gameUI, "CmdBuildHuman", this.disabledPrefix);
this.buildOrcUI = createBuiltInIconUI(gameUI, "CmdBuildOrc", this.disabledPrefix);
this.buildNightElfUI = createBuiltInIconUI(gameUI, "CmdBuildNightElf", this.disabledPrefix);
this.buildUndeadUI = createBuiltInIconUI(gameUI, "CmdBuildUndead", this.disabledPrefix);
this.buildNagaUI = createBuiltInIconUI(gameUI, "CmdBuildNaga", this.disabledPrefix);
this.buildNeutralUI = createBuiltInIconUI(gameUI, "CmdBuild", this.disabledPrefix);
this.attackGroundUI = createBuiltInIconUI(gameUI, "CmdAttackGround", this.disabledPrefix);
this.cancelUI = createBuiltInIconUI(gameUI, "CmdCancel", this.disabledPrefix);
this.cancelBuildUI = createBuiltInIconUI(gameUI, "CmdCancelBuild", this.disabledPrefix);
this.cancelTrainUI = createBuiltInIconUI(gameUI, "CmdCancelTrain", this.disabledPrefix);
this.rallyUI = createBuiltInIconUI(gameUI, "CmdRally", this.disabledPrefix);
this.selectSkillUI = createBuiltInIconUI(gameUI, "CmdSelectSkill", this.disabledPrefix);
}
private char getHotkey(final MutableGameObject abilityTypeData, final War3ID abilityHotkeyNormal) {
@ -277,7 +278,7 @@ public class AbilityDataUI {
return null;
}
private static String disable(final String path, final String disabledPrefix) {
public static String disable(final String path, final String disabledPrefix) {
final int slashIndex = path.lastIndexOf('\\');
String name = path;
if (slashIndex != -1) {
@ -354,4 +355,7 @@ public class AbilityDataUI {
return this.selectSkillUI;
}
public String getDisabledPrefix() {
return this.disabledPrefix;
}
}

View File

@ -1,5 +1,6 @@
package com.etheller.warsmash.viewer5.handlers.w3x.rendersim.commandbuttons;
import com.badlogic.gdx.graphics.Texture;
import com.etheller.warsmash.parsers.fdf.GameUI;
import com.etheller.warsmash.util.War3ID;
import com.etheller.warsmash.viewer5.handlers.w3x.rendersim.ability.AbilityDataUI;
@ -27,9 +28,12 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.G
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericSingleIconActiveAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.harvest.CAbilityReturnResources;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.hero.CAbilityHero;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.jass.CAbilityJass;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityQueue;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityRally;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityReviveHero;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass.CAbilityTypeJassDefinition.JassOrder;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass.CAbilityTypeJassDefinition.JassOrderCommandCardType;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.upgrade.CAbilityUpgrade;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.attacks.CUnitAttack;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.orders.OrderIds;
@ -172,6 +176,26 @@ public class CommandCardPopulatingAbilityVisitor implements CAbilityVisitor<Void
return null;
}
@Override
public Void accept(final CAbilityJass ability) {
if (ability.isIconShowing()) {
for (final JassOrder order : ability.getType().getJassOrders()) {
if (this.menuBaseOrderId == order.getContainerMenuOrderId()) {
addCommandButton(ability, this.gameUI.loadTexture(order.getIconPath()),
this.gameUI.loadTexture(
AbilityDataUI.disable(order.getIconPath(), this.abilityDataUI.getDisabledPrefix())),
order.getTip(), order.getUberTip(), order.getButtonPositionX(), order.getButtonPositionY(),
ability.getHandleId(), order.getOrderId(),
order.isAutoCastActive() ? order.getAutoCastOrderId() : order.getAutoCastUnOrderId(),
order.isAutoCastActive(), order.getType() == JassOrderCommandCardType.MENU,
order.getGoldCost(), order.getLumberCost(), order.getFoodCostDisplayOnly(),
order.getManaCost(), order.getCharges(), order.getHotkey());
}
}
}
return null;
}
@Override
public Void accept(final CAbilityOrcBuild ability) {
handleBuildMenu(ability, this.abilityDataUI.getBuildOrcUI());
@ -244,8 +268,18 @@ public class CommandCardPopulatingAbilityVisitor implements CAbilityVisitor<Void
private void addCommandButton(final CAbility ability, final IconUI iconUI, final String toolTip,
final int buttonPosX, final int buttonPosY, final int handleId, final int orderId,
final int autoCastOrderId, final boolean autoCastActive, final boolean menuButton, int goldCost,
int lumberCost, int foodCost, final int manaCost, final int numberOverlay) {
final int autoCastOrderId, final boolean autoCastActive, final boolean menuButton, final int goldCost,
final int lumberCost, final int foodCost, final int manaCost, final int numberOverlay) {
addCommandButton(ability, iconUI.getIcon(), iconUI.getIconDisabled(), toolTip, iconUI.getUberTip(), buttonPosX,
buttonPosY, handleId, orderId, autoCastOrderId, autoCastActive, menuButton, goldCost, lumberCost,
foodCost, manaCost, numberOverlay, iconUI.getHotkey());
}
private void addCommandButton(final CAbility ability, final Texture icon, final Texture iconDisabled,
final String toolTip, String uberTip, final int buttonPosX, final int buttonPosY, final int handleId,
final int orderId, final int autoCastOrderId, final boolean autoCastActive, final boolean menuButton,
int goldCost, int lumberCost, int foodCost, final int manaCost, final int numberOverlay,
final char hotkey) {
ability.checkCanUse(this.game, this.unit, orderId, this.previewCallback.reset());
if (!this.previewCallback.techtreeMaxReached) {
final boolean active = ((this.unit.getCurrentBehavior() != null)
@ -253,7 +287,6 @@ public class CommandCardPopulatingAbilityVisitor implements CAbilityVisitor<Void
final boolean disabled = ((ability != null) && ability.isDisabled()) || this.previewCallback.disabled;
final float cooldownRemaining = this.previewCallback.cooldownRemaining;
final float cooldownMax = this.previewCallback.cooldownMax;
String uberTip = iconUI.getUberTip();
if (disabled) {
// dont show these on disabled
goldCost = 0;
@ -263,10 +296,9 @@ public class CommandCardPopulatingAbilityVisitor implements CAbilityVisitor<Void
if (this.previewCallback.isShowingRequirements()) {
uberTip = this.previewCallback.getRequirementsText() + "|r" + uberTip;
}
this.commandButtonListener.commandButton(buttonPosX, buttonPosY,
disabled ? iconUI.getIconDisabled() : iconUI.getIcon(), handleId, disabled ? 0 : orderId,
autoCastOrderId, active, autoCastActive, menuButton, toolTip, uberTip, iconUI.getHotkey(), goldCost,
lumberCost, foodCost, manaCost, cooldownRemaining, cooldownMax, numberOverlay);
this.commandButtonListener.commandButton(buttonPosX, buttonPosY, disabled ? iconDisabled : icon, handleId,
disabled ? 0 : orderId, autoCastOrderId, active, autoCastActive, menuButton, toolTip, uberTip,
hotkey, goldCost, lumberCost, foodCost, manaCost, cooldownRemaining, cooldownMax, numberOverlay);
}
}
@ -411,6 +443,11 @@ public class CommandCardPopulatingAbilityVisitor implements CAbilityVisitor<Void
}
@Override
public void unknownReasonUseNotOk() {
}
@Override
public void notEnoughResources(final ResourceType resource) {
if (resource == ResourceType.MANA) {
@ -487,6 +524,11 @@ public class CommandCardPopulatingAbilityVisitor implements CAbilityVisitor<Void
}
@Override
public void noChargesRemaining() {
}
public boolean isShowingRequirements() {
return this.requirementsTextBuilder.length() != 0;
}
@ -512,9 +554,11 @@ public class CommandCardPopulatingAbilityVisitor implements CAbilityVisitor<Void
if (this.multiSelect) {
return null;
}
if (this.menuBaseOrderId == 0) {
final int skillPoints = ability.getSkillPoints();
addCommandButton(ability, this.abilityDataUI.getSelectSkillUI(), ability.getHandleId(), OrderIds.skillmenu,
0, false, true, 0, 0, 0, 0, skillPoints != 0 ? skillPoints : -1);
addCommandButton(ability, this.abilityDataUI.getSelectSkillUI(), ability.getHandleId(),
OrderIds.skillmenu, 0, false, true, 0, 0, 0, 0, skillPoints != 0 ? skillPoints : -1);
}
}
return null;
}

View File

@ -114,6 +114,11 @@ public class CDestructable extends CWidget {
return visitor.accept(this);
}
@Override
public <T> T visit(final CWidgetVisitor<T> visitor) {
return visitor.accept(this);
}
public CDestructableType getDestType() {
return this.destType;
}

View File

@ -65,6 +65,11 @@ public class CItem extends CWidget {
return visitor.accept(this);
}
@Override
public <T> T visit(final CWidgetVisitor<T> visitor) {
return visitor.accept(this);
}
public War3ID getTypeId() {
return this.typeId;
}

View File

@ -1229,6 +1229,9 @@ public class CUnit extends CWidget {
public boolean canReachToPathing(final float range, final float rotationForPathing,
final BufferedImage buildingPathingPixelMap, final float targetX, final float targetY) {
if (buildingPathingPixelMap == null) {
return canReach(targetX, targetY, range);
}
final int rotation = ((int) rotationForPathing + 450) % 360;
final float relativeOffsetX = getX() - targetX;
final float relativeOffsetY = getY() - targetY;
@ -1753,6 +1756,11 @@ public class CUnit extends CWidget {
return visitor.accept(this);
}
@Override
public <T> T visit(final CWidgetVisitor<T> visitor) {
return visitor.accept(this);
}
private static final class UseAbilityOnTargetByIdVisitor implements AbilityTargetVisitor<Void> {
private static final UseAbilityOnTargetByIdVisitor INSTANCE = new UseAbilityOnTargetByIdVisitor();
private CSimulation game;

View File

@ -73,6 +73,8 @@ public abstract class CWidget implements AbilityTarget, CHandle {
public abstract float getImpactZ();
public abstract <T> T visit(CWidgetVisitor<T> visitor);
public boolean isDead() {
return this.life <= 0;
}

View File

@ -0,0 +1,9 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation;
public interface CWidgetVisitor<T> {
T accept(CUnit target);
T accept(CDestructable target);
T accept(CItem target);
}

View File

@ -12,6 +12,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.G
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericSingleIconActiveAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.harvest.CAbilityReturnResources;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.hero.CAbilityHero;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.jass.CAbilityJass;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityQueue;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityRally;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityReviveHero;
@ -63,4 +64,6 @@ public interface CAbilityVisitor<T> {
T accept(GenericNoIconAbility ability);
T accept(CAbilityHero ability);
T accept(CAbilityJass ability);
}

View File

@ -14,6 +14,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.G
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericSingleIconActiveAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.harvest.CAbilityReturnResources;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.hero.CAbilityHero;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.jass.CAbilityJass;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityQueue;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityRally;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityReviveHero;
@ -147,4 +148,12 @@ public class GetAbilityByRawcodeVisitor implements CAbilityVisitor<CLevelingAbil
return null;
}
@Override
public CLevelingAbility accept(final CAbilityJass ability) {
if (this.rawcode.equals(ability.getAlias())) {
return ability;
}
return null;
}
}

View File

@ -0,0 +1,110 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.jass;
import com.etheller.warsmash.parsers.jass.scope.CommonTriggerExecutionScope;
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.CAbilityVisitor;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.AbstractGenericAliasedAbility;
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.types.jass.CAbilityTypeJassDefinition;
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 CAbilityJass extends AbstractGenericAliasedAbility {
private final CAbilityTypeJassDefinition typeDefinition;
private CommonTriggerExecutionScope jassAbilityBasicScope;
public CAbilityJass(final int handleId, final War3ID alias, final CAbilityTypeJassDefinition type) {
super(handleId, alias);
this.typeDefinition = type;
}
public CommonTriggerExecutionScope getJassAbilityBasicScope() {
return this.jassAbilityBasicScope;
}
@Override
public void onAdd(final CSimulation game, final CUnit unit) {
this.jassAbilityBasicScope = CommonTriggerExecutionScope.jassAbilityBasicScope(this, unit, getAlias());
this.typeDefinition.onAdd(game, this, unit);
}
@Override
public void onRemove(final CSimulation game, final CUnit unit) {
this.typeDefinition.onRemove(game, this, unit);
}
@Override
public void onTick(final CSimulation game, final CUnit unit) {
this.typeDefinition.onTick(game, this, unit);
}
@Override
public void onDeath(final CSimulation game, final CUnit cUnit) {
this.typeDefinition.onDeath(game, this, cUnit);
}
@Override
public void onCancelFromQueue(final CSimulation game, final CUnit unit, final int orderId) {
this.typeDefinition.onCancelFromQueue(game, this, unit, orderId);
}
@Override
public CBehavior begin(final CSimulation game, final CUnit caster, final int orderId, final CWidget target) {
return this.typeDefinition.begin(game, this, caster, orderId, target);
}
@Override
public CBehavior begin(final CSimulation game, final CUnit caster, final int orderId,
final AbilityPointTarget point) {
return this.typeDefinition.begin(game, this, caster, orderId, point);
}
@Override
public CBehavior beginNoTarget(final CSimulation game, final CUnit caster, final int orderId) {
return this.typeDefinition.beginNoTarget(game, this, caster, orderId);
}
@Override
public void checkCanTarget(final CSimulation game, final CUnit unit, final int orderId, final CWidget target,
final AbilityTargetCheckReceiver<CWidget> receiver) {
this.typeDefinition.checkCanTarget(game, this, unit, orderId, target, receiver);
}
@Override
public void checkCanTarget(final CSimulation game, final CUnit unit, final int orderId,
final AbilityPointTarget target, final AbilityTargetCheckReceiver<AbilityPointTarget> receiver) {
this.typeDefinition.checkCanTarget(game, this, unit, orderId, target, receiver);
}
@Override
public void checkCanTargetNoTarget(final CSimulation game, final CUnit unit, final int orderId,
final AbilityTargetCheckReceiver<Void> receiver) {
this.typeDefinition.checkCanTargetNoTarget(game, this, unit, orderId, receiver);
}
@Override
public <T> T visit(final CAbilityVisitor<T> visitor) {
return visitor.accept(this);
}
@Override
protected void innerCheckCanUse(final CSimulation game, final CUnit unit, final int orderId,
final AbilityActivationReceiver receiver) {
this.typeDefinition.checkCanUse(game, this, unit, orderId, receiver);
}
@Override
public boolean checkBeforeQueue(final CSimulation game, final CUnit caster, final int orderId,
final AbilityTarget target) {
return this.typeDefinition.checkBeforeQueue(game, this, caster, orderId, target);
}
public CAbilityTypeJassDefinition getType() {
return this.typeDefinition;
}
}

View File

@ -0,0 +1,34 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl;
import java.util.List;
import com.etheller.interpreter.ast.scope.GlobalScope;
import com.etheller.warsmash.util.War3ID;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CSimulation;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.CLevelingAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.jass.CAbilityJass;
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.jass.CAbilityTypeJassDefinition;
public class CAbilityTypeJass extends CAbilityType<CAbilityTypeLevelData> {
private final CAbilityTypeJassDefinition abilityTypeJassDefinition;
public CAbilityTypeJass(final War3ID alias, final War3ID code, final List<CAbilityTypeLevelData> levelData,
final GlobalScope jassGlobalScope, final CAbilityTypeJassDefinition abilityTypeJassDefinition) {
super(alias, code, levelData);
this.abilityTypeJassDefinition = abilityTypeJassDefinition;
}
@Override
public CAbility createAbility(final int handleId) {
return new CAbilityJass(handleId, getAlias(), this.abilityTypeJassDefinition);
}
@Override
public void setLevel(final CSimulation game, final CLevelingAbility existingAbility, final int level) {
existingAbility.setLevel(level);
}
}

View File

@ -0,0 +1,9 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass;
import com.etheller.interpreter.ast.scope.GlobalScope;
import com.etheller.interpreter.ast.scope.TriggerExecutionScope;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.behaviors.CBehavior;
public interface BehaviorExpr {
CBehavior evaluate(GlobalScope globalScope, TriggerExecutionScope triggerScope);
}

View File

@ -0,0 +1,708 @@
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import com.etheller.interpreter.ast.function.JassFunction;
import com.etheller.interpreter.ast.scope.GlobalScope;
import com.etheller.interpreter.ast.scope.TriggerExecutionScope;
import com.etheller.interpreter.ast.scope.trigger.TriggerBooleanExpression;
import com.etheller.interpreter.ast.value.JassValue;
import com.etheller.interpreter.ast.value.visitor.BooleanJassValueVisitor;
import com.etheller.interpreter.ast.value.visitor.ObjectJassValueVisitor;
import com.etheller.warsmash.parsers.jass.scope.CommonTriggerExecutionScope;
import com.etheller.warsmash.units.manager.MutableObjectData.MutableGameObject;
import com.etheller.warsmash.util.War3ID;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CDestructable;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CItem;
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.CWidgetVisitor;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.jass.CAbilityJass;
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.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;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl.AbstractCAbilityTypeDefinition;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.impl.CAbilityTypeJass;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.behaviors.CBehavior;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CTargetType;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.players.CPlayer;
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 CAbilityTypeJassDefinition extends AbstractCAbilityTypeDefinition<CAbilityTypeLevelData>
implements CAbilityTypeDefinition {
private JassFunction onAddJass;
private JassFunction onRemoveJass;
private JassFunction onTickJass;
private JassFunction onDeathJass;
private JassFunction onCancelFromQueueJass;
private BehaviorExpr beginJass;
private TriggerBooleanExpression checkBeforeQueueJass;
private TriggerBooleanExpression checkTargetJass;
private TriggerBooleanExpression checkUseJass;
private final List<JassOrder> jassOrders;
private final GlobalScope jassGlobalScope;
private boolean enabledWhileUnderConstruction;
private boolean enabledWhileUpgrading;
private War3ID code;
public CAbilityTypeJassDefinition(final GlobalScope jassGlobalScope) {
this.jassGlobalScope = jassGlobalScope;
this.jassOrders = new ArrayList<>();
}
public void setCode(final War3ID code) {
this.code = code;
}
@Override
protected CAbilityTypeLevelData createLevelData(final MutableGameObject abilityEditorData, final int level) {
final String targetsAllowedAtLevelString = abilityEditorData.getFieldAsString(TARGETS_ALLOWED, level);
final EnumSet<CTargetType> targetsAllowedAtLevel = CTargetType.parseTargetTypeSet(targetsAllowedAtLevelString);
return new CAbilityTypeLevelData(targetsAllowedAtLevel);
}
@Override
protected CAbilityType<?> innerCreateAbilityType(final War3ID alias, final MutableGameObject abilityEditorData,
final List<CAbilityTypeLevelData> levelData) {
return new CAbilityTypeJass(alias, this.code, levelData, this.jassGlobalScope, this);
}
public void setOnAddJass(final JassFunction onAddJass) {
this.onAddJass = onAddJass;
}
public void setOnRemoveJass(final JassFunction onRemoveJass) {
this.onRemoveJass = onRemoveJass;
}
public void setOnTickJass(final JassFunction onTickJass) {
this.onTickJass = onTickJass;
}
public void setOnDeathJass(final JassFunction onDeathJass) {
this.onDeathJass = onDeathJass;
}
public void setOnCancelFromQueueJass(final JassFunction onCancelFromQueueJass) {
this.onCancelFromQueueJass = onCancelFromQueueJass;
}
public void setBeginJass(final BehaviorExpr beginJass) {
this.beginJass = beginJass;
}
public void setCheckBeforeQueueJass(final TriggerBooleanExpression checkBeforeQueueJass) {
this.checkBeforeQueueJass = checkBeforeQueueJass;
}
public void setCheckTargetCondition(final TriggerBooleanExpression checkTargetJass) {
this.checkTargetJass = checkTargetJass;
}
public void setCheckUseCondition(final TriggerBooleanExpression checkUseJass) {
this.checkUseJass = checkUseJass;
}
public boolean isEnabledWhileUnderConstruction() {
return this.enabledWhileUnderConstruction;
}
public void setEnabledWhileUnderConstruction(final boolean enabledWhileUnderConstruction) {
this.enabledWhileUnderConstruction = enabledWhileUnderConstruction;
}
public boolean isEnabledWhileUpgrading() {
return this.enabledWhileUpgrading;
}
public void setEnabledWhileUpgrading(final boolean enabledWhileUpgrading) {
this.enabledWhileUpgrading = enabledWhileUpgrading;
}
public void addJassOrder(final JassOrder order) {
this.jassOrders.add(order);
}
public void removeJassOrder(final JassOrder order) {
this.jassOrders.remove(order);
}
public List<JassOrder> getJassOrders() {
return this.jassOrders;
}
private void execute(final JassFunction function, final List<JassValue> args, final TriggerExecutionScope scope) {
if (function != null) {
function.call(args, this.jassGlobalScope, scope);
}
}
private JassValue evaluate(final JassFunction function, final List<JassValue> args,
final TriggerExecutionScope scope) {
if (function != null) {
return function.call(args, this.jassGlobalScope, scope);
}
return null;
}
private CBehavior evaluateBehavior(final JassFunction function, final CSimulation game, final CUnit caster,
final List<JassValue> args, final TriggerExecutionScope scope) {
final JassValue userBehaviorValue = evaluate(function, args, scope);
if (userBehaviorValue == null) {
return caster.pollNextOrderBehavior(game);
}
final CBehavior userBehavior = userBehaviorValue.visit(ObjectJassValueVisitor.getInstance());
return userBehavior;
}
private boolean evaluateBoolean(final JassFunction function, final CSimulation game, final CUnit caster,
final List<JassValue> args, final TriggerExecutionScope scope) {
final JassValue userBooleanValue = evaluate(function, args, scope);
if (userBooleanValue == null) {
return false;
}
return userBooleanValue.visit(BooleanJassValueVisitor.getInstance());
}
public void onAdd(final CSimulation game, final CAbilityJass abilityJass, final CUnit unit) {
execute(this.onAddJass, Collections.emptyList(), abilityJass.getJassAbilityBasicScope());
}
public void onRemove(final CSimulation game, final CAbilityJass abilityJass, final CUnit unit) {
execute(this.onRemoveJass, Collections.emptyList(), abilityJass.getJassAbilityBasicScope());
}
public void onTick(final CSimulation game, final CAbilityJass abilityJass, final CUnit unit) {
execute(this.onTickJass, Collections.emptyList(), abilityJass.getJassAbilityBasicScope());
}
public void onDeath(final CSimulation game, final CAbilityJass abilityJass, final CUnit unit) {
execute(this.onDeathJass, Collections.emptyList(), abilityJass.getJassAbilityBasicScope());
}
public void onCancelFromQueue(final CSimulation game, final CAbilityJass abilityJass, final CUnit unit,
final int orderId) {
execute(this.onCancelFromQueueJass, Collections.emptyList(),
CommonTriggerExecutionScope.jassAbilityBasicScope(abilityJass, unit, abilityJass.getAlias(), orderId));
}
public CBehavior begin(final CSimulation game, final CAbilityJass abilityJass, final CUnit caster,
final int orderId, final CWidget target) {
final JassOrder orderCommandCardIcon = getOrderCommandCardIcon(game, caster, orderId);
if (orderCommandCardIcon.type == JassOrderCommandCardType.INSTANT_NO_TARGET) {
if (this.beginJass != null) {
CommonTriggerExecutionScope scope;
scope = target.visit(new CWidgetVisitor<CommonTriggerExecutionScope>() {
@Override
public CommonTriggerExecutionScope accept(final CUnit target) {
return CommonTriggerExecutionScope.jassAbilityTargetScope(abilityJass, caster, target,
abilityJass.getAlias(), orderId, orderCommandCardIcon.type, orderCommandCardIcon);
}
@Override
public CommonTriggerExecutionScope accept(final CDestructable target) {
return CommonTriggerExecutionScope.jassAbilityTargetScope(abilityJass, caster, target,
abilityJass.getAlias(), orderId, orderCommandCardIcon.type, orderCommandCardIcon);
}
@Override
public CommonTriggerExecutionScope accept(final CItem target) {
return CommonTriggerExecutionScope.jassAbilityTargetScope(abilityJass, caster, target,
abilityJass.getAlias(), orderId, orderCommandCardIcon.type, orderCommandCardIcon);
}
});
return this.beginJass.evaluate(this.jassGlobalScope, scope);
}
else {
return caster.pollNextOrderBehavior(game);
}
}
else {
return caster.pollNextOrderBehavior(game);
}
}
public CBehavior begin(final CSimulation game, final CAbilityJass abilityJass, final CUnit caster,
final int orderId, final AbilityPointTarget point) {
final JassOrder orderCommandCardIcon = getOrderCommandCardIcon(game, caster, orderId);
if (orderCommandCardIcon.type == JassOrderCommandCardType.INSTANT_NO_TARGET) {
if (this.beginJass != null) {
return this.beginJass.evaluate(this.jassGlobalScope,
CommonTriggerExecutionScope.jassAbilityPointScope(abilityJass, caster, point,
abilityJass.getAlias(), orderId, orderCommandCardIcon.type, orderCommandCardIcon));
}
else {
return caster.pollNextOrderBehavior(game);
}
}
else {
return caster.pollNextOrderBehavior(game);
}
}
public CBehavior beginNoTarget(final CSimulation game, final CAbilityJass abilityJass, final CUnit caster,
final int orderId) {
final JassOrder orderCommandCardIcon = getOrderCommandCardIcon(game, caster, orderId);
if (orderCommandCardIcon.type == JassOrderCommandCardType.INSTANT_NO_TARGET) {
if (this.beginJass != null) {
return this.beginJass.evaluate(this.jassGlobalScope,
CommonTriggerExecutionScope.jassAbilityNoTargetScope(abilityJass, caster,
abilityJass.getAlias(), orderId, orderCommandCardIcon.type, orderCommandCardIcon));
}
else {
return caster.pollNextOrderBehavior(game);
}
}
else {
return caster.pollNextOrderBehavior(game);
}
}
public boolean checkBeforeQueue(final CSimulation game, final CAbilityJass abilityJass, final CUnit caster,
final int orderId, final AbilityTarget target) {
if (orderId != 0) {
for (final JassOrder order : this.jassOrders) {
if (order.autoCastOrderId == orderId) {
order.autoCastActive = true;
return false;
}
else if (order.autoCastUnOrderId == orderId) {
order.autoCastActive = false;
return false;
}
}
}
final JassOrder orderCommandCardIcon = getOrderCommandCardIcon(game, caster, orderId);
if (orderCommandCardIcon.type == JassOrderCommandCardType.INSTANT_NO_TARGET_NO_INTERRUPT) {
if (this.checkBeforeQueueJass != null) {
return this.checkBeforeQueueJass.evaluate(this.jassGlobalScope,
CommonTriggerExecutionScope.jassAbilityNoTargetScope(abilityJass, caster,
abilityJass.getAlias(), orderId, orderCommandCardIcon.type, orderCommandCardIcon));
}
else {
return false;
}
}
else {
return true;
}
}
public void checkCanTarget(final CSimulation game, final CAbilityJass abilityJass, final CUnit unit,
final int orderId, final CWidget target, final AbilityTargetCheckReceiver<CWidget> receiver) {
final JassOrder orderCommandCardIcon = getOrderCommandCardIcon(game, unit, orderId);
if ((orderCommandCardIcon != null) && ((orderCommandCardIcon.type == JassOrderCommandCardType.UNIT_TARGET)
|| (orderCommandCardIcon.type == JassOrderCommandCardType.UNIT_OR_POINT_TARGET))) {
if (this.checkTargetJass != null) {
CommonTriggerExecutionScope scope;
scope = target.visit(new CWidgetVisitor<CommonTriggerExecutionScope>() {
@Override
public CommonTriggerExecutionScope accept(final CUnit target) {
return CommonTriggerExecutionScope.jassAbilityTargetScope(abilityJass, unit, target,
abilityJass.getAlias(), orderId, orderCommandCardIcon.type, orderCommandCardIcon);
}
@Override
public CommonTriggerExecutionScope accept(final CDestructable target) {
return CommonTriggerExecutionScope.jassAbilityTargetScope(abilityJass, unit, target,
abilityJass.getAlias(), orderId, orderCommandCardIcon.type, orderCommandCardIcon);
}
@Override
public CommonTriggerExecutionScope accept(final CItem target) {
return CommonTriggerExecutionScope.jassAbilityTargetScope(abilityJass, unit, target,
abilityJass.getAlias(), orderId, orderCommandCardIcon.type, orderCommandCardIcon);
}
});
if (this.checkTargetJass.evaluate(this.jassGlobalScope, scope)) {
receiver.targetOk(target);
}
else {
receiver.orderIdNotAccepted();
}
}
else {
receiver.targetOk(target);
}
}
else {
receiver.orderIdNotAccepted();
}
}
public void checkCanTarget(final CSimulation game, final CAbilityJass abilityJass, final CUnit unit,
final int orderId, final AbilityPointTarget target,
final AbilityTargetCheckReceiver<AbilityPointTarget> receiver) {
final JassOrder orderCommandCardIcon = getOrderCommandCardIcon(game, unit, orderId);
if ((orderCommandCardIcon != null) && ((orderCommandCardIcon.type == JassOrderCommandCardType.POINT_TARGET)
|| (orderCommandCardIcon.type == JassOrderCommandCardType.UNIT_OR_POINT_TARGET))) {
if (this.checkTargetJass != null) {
if (this.checkTargetJass.evaluate(this.jassGlobalScope,
CommonTriggerExecutionScope.jassAbilityPointScope(abilityJass, unit, target,
abilityJass.getAlias(), orderId, orderCommandCardIcon.type, orderCommandCardIcon))) {
receiver.targetOk(target);
}
else {
receiver.orderIdNotAccepted();
}
}
else {
receiver.targetOk(target);
}
}
else {
receiver.orderIdNotAccepted();
}
}
public void checkCanTargetNoTarget(final CSimulation game, final CAbilityJass abilityJass, final CUnit unit,
final int orderId, final AbilityTargetCheckReceiver<Void> receiver) {
final JassOrder orderCommandCardIcon = getOrderCommandCardIcon(game, unit, orderId);
if ((orderCommandCardIcon != null)
&& (orderCommandCardIcon.type == JassOrderCommandCardType.INSTANT_NO_TARGET)) {
if (this.checkTargetJass != null) {
if (this.checkTargetJass.evaluate(this.jassGlobalScope,
CommonTriggerExecutionScope.jassAbilityNoTargetScope(abilityJass, unit, abilityJass.getAlias(),
orderId, orderCommandCardIcon.type, orderCommandCardIcon))) {
receiver.targetOk(null);
}
else {
receiver.orderIdNotAccepted();
}
}
else {
receiver.targetOk(null);
}
}
else {
receiver.orderIdNotAccepted();
}
}
public void checkCanUse(final CSimulation game, final CAbilityJass abilityJass, final CUnit unit, final int orderId,
final AbilityActivationReceiver receiver) {
final JassOrder orderCommandCardIcon = getOrderCommandCardIcon(game, unit, orderId);
if ((orderCommandCardIcon == null) || orderCommandCardIcon.disabled) {
receiver.disabled();
}
else if (orderCommandCardIcon.type == JassOrderCommandCardType.PASSIVE) {
receiver.notAnActiveAbility();
}
else if (orderCommandCardIcon.charges == 0) {
receiver.noChargesRemaining();
}
else if (unit.getMana() < orderCommandCardIcon.manaCost) {
receiver.notEnoughResources(ResourceType.MANA);
}
else {
final CPlayer player = game.getPlayer(unit.getPlayerIndex());
if (player.getGold() < orderCommandCardIcon.goldCost) {
receiver.notEnoughResources(ResourceType.GOLD);
}
else if (player.getLumber() < orderCommandCardIcon.lumberCost) {
receiver.notEnoughResources(ResourceType.LUMBER);
}
else if ((player.getFoodUsed() + orderCommandCardIcon.foodCostDisplayOnly) < player.getFoodCap()) {
receiver.notEnoughResources(ResourceType.FOOD);
}
else {
if (this.checkUseJass != null) {
if (this.checkUseJass.evaluate(this.jassGlobalScope,
CommonTriggerExecutionScope.jassAbilityBasicScope(abilityJass, unit, abilityJass.getAlias(),
orderId, orderCommandCardIcon.type, orderCommandCardIcon))) {
receiver.useOk();
}
else {
receiver.unknownReasonUseNotOk();
}
}
else {
receiver.useOk();
}
}
}
}
public JassOrder getOrderCommandCardIcon(final CSimulation game, final CUnit unit, final int orderId) {
JassOrder commandCardIconToUse = null;
// TODO for now this is trying to disambiguate between multiple icons with the
// same ID if you have
// them. I try to put forward a best guess, but that's generally a broken
// concept and maybe later
// this function should just be simplified to return based on orderID (such as
// if we just used
// a simple map lookup). Two icons on same ability with same order ID should not
// be allowed.
for (final JassOrder orderCommandCardIcon : this.jassOrders) {
if (orderCommandCardIcon.orderId == orderId) {
if (commandCardIconToUse == null) {
commandCardIconToUse = orderCommandCardIcon;
}
if (orderCommandCardIcon.disabled) {
continue;
}
if (orderCommandCardIcon.type == JassOrderCommandCardType.PASSIVE) {
continue;
}
if (orderCommandCardIcon.charges == 0) {
continue;
}
if (unit.getMana() < orderCommandCardIcon.manaCost) {
continue;
}
final CPlayer player = game.getPlayer(unit.getPlayerIndex());
if (player.getGold() < orderCommandCardIcon.goldCost) {
continue;
}
if (player.getLumber() < orderCommandCardIcon.lumberCost) {
continue;
}
if ((player.getFoodUsed() + orderCommandCardIcon.foodCostDisplayOnly) < player.getFoodCap()) {
continue;
}
commandCardIconToUse = orderCommandCardIcon;
}
}
return commandCardIconToUse;
}
public static final class JassOrder {
private static final int INFINITE_CHARGES = -1;
private int orderId;
private int autoCastOrderId;
private int autoCastUnOrderId;
private int containerMenuOrderId;
private boolean disabled;
private int manaCost;
private int goldCost;
private int lumberCost;
private int charges = INFINITE_CHARGES;
private int foodCostDisplayOnly;
private JassOrderCommandCardType type;
private boolean autoCastActive;
// UI
private boolean hidden;
private String iconPath;
private int buttonPositionX;
private int buttonPositionY;
private String tip;
private String uberTip;
private char hotkey;
private String mouseTargetModelPath;
private String mouseTargetPathingMap;
private War3ID previewBuildUnitId;
private float mouseTargetRadius;
public JassOrder(final int orderId, final int buttonPositionX, final int buttonPositionY) {
this.orderId = orderId;
this.buttonPositionX = buttonPositionX;
this.buttonPositionY = buttonPositionY;
}
public int getOrderId() {
return this.orderId;
}
public void setOrderId(final int orderId) {
this.orderId = orderId;
}
public int getAutoCastOrderId() {
return this.autoCastOrderId;
}
public void setAutoCastOrderId(final int autoCastOrderId) {
this.autoCastOrderId = autoCastOrderId;
}
public int getAutoCastUnOrderId() {
return this.autoCastUnOrderId;
}
public void setAutoCastUnOrderId(final int autoCastUnOrderId) {
this.autoCastUnOrderId = autoCastUnOrderId;
}
public int getContainerMenuOrderId() {
return this.containerMenuOrderId;
}
public void setContainerMenuOrderId(final int containerMenuOrderId) {
this.containerMenuOrderId = containerMenuOrderId;
}
public boolean isDisabled() {
return this.disabled;
}
public void setDisabled(final boolean disabled) {
this.disabled = disabled;
}
public int getManaCost() {
return this.manaCost;
}
public void setManaCost(final int manaCost) {
this.manaCost = manaCost;
}
public int getGoldCost() {
return this.goldCost;
}
public void setGoldCost(final int goldCost) {
this.goldCost = goldCost;
}
public int getLumberCost() {
return this.lumberCost;
}
public void setLumberCost(final int lumberCost) {
this.lumberCost = lumberCost;
}
public int getCharges() {
return this.charges;
}
public void setCharges(final int charges) {
this.charges = charges;
}
public int getFoodCostDisplayOnly() {
return this.foodCostDisplayOnly;
}
public void setFoodCostDisplayOnly(final int foodCostDisplayOnly) {
this.foodCostDisplayOnly = foodCostDisplayOnly;
}
public JassOrderCommandCardType getType() {
return this.type;
}
public void setType(final JassOrderCommandCardType type) {
this.type = type;
}
public boolean isAutoCastActive() {
return this.autoCastActive;
}
public void setAutoCastActive(final boolean autoCastActive) {
this.autoCastActive = autoCastActive;
}
public boolean isHidden() {
return this.hidden;
}
public void setHidden(final boolean hidden) {
this.hidden = hidden;
}
public String getIconPath() {
return this.iconPath;
}
public void setIconPath(final String iconPath) {
this.iconPath = iconPath;
}
public int getButtonPositionX() {
return this.buttonPositionX;
}
public void setButtonPositionX(final int buttonPositionX) {
this.buttonPositionX = buttonPositionX;
}
public int getButtonPositionY() {
return this.buttonPositionY;
}
public void setButtonPositionY(final int buttonPositionY) {
this.buttonPositionY = buttonPositionY;
}
public String getTip() {
return this.tip;
}
public void setTip(final String tip) {
this.tip = tip;
}
public String getUberTip() {
return this.uberTip;
}
public void setUberTip(final String uberTip) {
this.uberTip = uberTip;
}
public char getHotkey() {
return this.hotkey;
}
public void setHotkey(final char hotkey) {
this.hotkey = hotkey;
}
public String getMouseTargetModelPath() {
return this.mouseTargetModelPath;
}
public void setMouseTargetModelPath(final String mouseTargetModelPath) {
this.mouseTargetModelPath = mouseTargetModelPath;
}
public String getMouseTargetPathingMap() {
return this.mouseTargetPathingMap;
}
public void setMouseTargetPathingMap(final String mouseTargetPathingMap) {
this.mouseTargetPathingMap = mouseTargetPathingMap;
}
public War3ID getPreviewBuildUnitId() {
return this.previewBuildUnitId;
}
public void setPreviewBuildUnitId(final War3ID previewBuildUnitId) {
this.previewBuildUnitId = previewBuildUnitId;
}
public float getMouseTargetRadius() {
return this.mouseTargetRadius;
}
public void setMouseTargetRadius(final float mouseTargetRadius) {
this.mouseTargetRadius = mouseTargetRadius;
}
}
public static enum JassOrderCommandCardType {
INSTANT_NO_TARGET, UNIT_TARGET, POINT_TARGET, UNIT_OR_POINT_TARGET, INSTANT_NO_TARGET_NO_INTERRUPT, PASSIVE,
MENU;
public static JassOrderCommandCardType[] VALUES = values();
}
}

View File

@ -4,6 +4,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.AnimationTokens.PrimaryTag;
import com.etheller.warsmash.viewer5.handlers.w3x.SequenceUtils;
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.targeting.AbilityTargetStillAliveVisitor;
public class CBehaviorFollow extends CAbstractRangedBehavior {
@ -15,7 +16,7 @@ public class CBehaviorFollow extends CAbstractRangedBehavior {
super(unit);
}
public CBehavior reset(final int higlightOrderId, final CUnit target) {
public CBehavior reset(final int higlightOrderId, final CWidget target) {
this.higlightOrderId = higlightOrderId;
return innerReset(target);
}
@ -27,7 +28,7 @@ public class CBehaviorFollow extends CAbstractRangedBehavior {
@Override
public boolean isWithinRange(final CSimulation simulation) {
if(justAutoAttacked = this.unit.autoAcquireAttackTargets(simulation, false)) {
if (this.justAutoAttacked = this.unit.autoAcquireAttackTargets(simulation, false)) {
return true;
}
return this.unit.canReach(this.target, this.unit.getAcquisitionRange());
@ -42,7 +43,7 @@ public class CBehaviorFollow extends CAbstractRangedBehavior {
@Override
protected CBehavior updateOnInvalidTarget(final CSimulation simulation) {
unit.setDefaultBehavior(unit.getStopBehavior());
this.unit.setDefaultBehavior(this.unit.getStopBehavior());
return this.unit.pollNextOrderBehavior(simulation);
}
@ -50,7 +51,7 @@ public class CBehaviorFollow extends CAbstractRangedBehavior {
protected boolean checkTargetStillValid(final CSimulation simulation) {
if (this.justAutoAttacked) {
this.justAutoAttacked = false;
this.unit.getMoveBehavior().reset(target, this, false);
this.unit.getMoveBehavior().reset(this.target, this, false);
}
return this.target.visit(AbilityTargetStillAliveVisitor.INSTANCE);
}

View File

@ -16,6 +16,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.G
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericSingleIconActiveAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.harvest.CAbilityReturnResources;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.hero.CAbilityHero;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.jass.CAbilityJass;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityQueue;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityRally;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityReviveHero;
@ -157,4 +158,11 @@ public class AbilityDisableWhileUnderConstructionVisitor implements CAbilityVisi
return null;
}
@Override
public Void accept(final CAbilityJass ability) {
final boolean enabledWhileUnderConstruction = ability.getType().isEnabledWhileUnderConstruction();
ability.setDisabled(!enabledWhileUnderConstruction);
ability.setIconShowing(enabledWhileUnderConstruction);
return null;
}
}

View File

@ -16,6 +16,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.G
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.generic.GenericSingleIconActiveAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.harvest.CAbilityReturnResources;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.hero.CAbilityHero;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.jass.CAbilityJass;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityQueue;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityRally;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityReviveHero;
@ -156,4 +157,12 @@ public class AbilityDisableWhileUpgradingVisitor implements CAbilityVisitor<Void
return null;
}
@Override
public Void accept(final CAbilityJass ability) {
final boolean enabledWhileUpgrading = ability.getType().isEnabledWhileUpgrading();
ability.setDisabled(!enabledWhileUpgrading);
ability.setIconShowing(enabledWhileUpgrading);
return null;
}
}

View File

@ -54,12 +54,12 @@ public class CBehaviorCarrionSwarmDummy extends CAbstractRangedBehavior {
protected CBehavior update(final CSimulation simulation, final boolean withinFacingWindow) {
final int playerIndex = this.unit.getPlayerIndex();
if (this.target instanceof AbilityPointTarget) {
simulation.getPlayer(playerIndex).fireAbilityEffectEventsPoint(this.unit,
simulation.getPlayer(playerIndex).fireAbilityEffectEventsPoint(this.abilityCarrionSwarmDummy, this.unit,
((AbilityPointTarget) this.target), this.abilityCarrionSwarmDummy.getAlias());
}
else if (this.target instanceof CUnit) {
simulation.getPlayer(playerIndex).fireAbilityEffectEventsTarget(this.unit, ((CUnit) this.target),
this.abilityCarrionSwarmDummy.getAlias());
simulation.getPlayer(playerIndex).fireAbilityEffectEventsTarget(this.abilityCarrionSwarmDummy, this.unit,
((CUnit) this.target), this.abilityCarrionSwarmDummy.getAlias());
} // TODO other kinds of widgets
return this.unit.pollNextOrderBehavior(simulation);
}

View File

@ -36,6 +36,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.def
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.definitions.impl.CAbilityTypeDefinitionLoad;
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.CAbilityTypeDefinitionWispHarvest;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass.CAbilityTypeJassDefinition;
public class CAbilityData {
private static final War3ID REQUIRED_LEVEL = War3ID.fromString("arlv");
@ -90,6 +91,10 @@ public class CAbilityData {
this.codeToAbilityTypeDefinition.put(War3ID.fromString("Adro"), new CAbilityTypeDefinitionDrop());
}
public void registerJassType(final War3ID war3id, final CAbilityTypeJassDefinition whichAbilityType) {
this.codeToAbilityTypeDefinition.put(war3id, whichAbilityType);
}
public CAbilityType<?> getAbilityType(final War3ID alias) {
CAbilityType<?> abilityType = this.aliasToAbilityType.get(alias);
if (abilityType == null) {

View File

@ -17,6 +17,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CPlayerStateListene
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.CUnitType;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbility;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.targeting.AbilityPointTarget;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.config.CBasePlayer;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.trigger.JassGameEventsWar3;
@ -469,28 +470,28 @@ public class CPlayer extends CBasePlayer {
return this.handicap;
}
public void fireAbilityEffectEventsTarget(final CUnit spellAbilityUnit, final CUnit spellTargetUnit,
final War3ID alias) {
public void fireAbilityEffectEventsTarget(final CAbility spellAbility, final CUnit spellAbilityUnit,
final CUnit spellTargetUnit, final War3ID alias) {
final List<CPlayerEvent> eventList = getEventList(JassGameEventsWar3.EVENT_PLAYER_UNIT_SPELL_EFFECT);
if (eventList != null) {
for (final CPlayerEvent event : eventList) {
event.fire(spellAbilityUnit,
CommonTriggerExecutionScope.unitSpellEffectTargetScope(
JassGameEventsWar3.EVENT_PLAYER_UNIT_SPELL_EFFECT, event.getTrigger(), spellAbilityUnit,
spellTargetUnit, alias));
JassGameEventsWar3.EVENT_PLAYER_UNIT_SPELL_EFFECT, event.getTrigger(), spellAbility,
spellAbilityUnit, spellTargetUnit, alias));
}
}
}
public void fireAbilityEffectEventsPoint(final CUnit spellAbilityUnit, final AbilityPointTarget abilityPointTarget,
final War3ID alias) {
public void fireAbilityEffectEventsPoint(final CAbility spellAbility, final CUnit spellAbilityUnit,
final AbilityPointTarget abilityPointTarget, final War3ID alias) {
final List<CPlayerEvent> eventList = getEventList(JassGameEventsWar3.EVENT_PLAYER_UNIT_SPELL_EFFECT);
if (eventList != null) {
for (final CPlayerEvent event : eventList) {
event.fire(spellAbilityUnit,
CommonTriggerExecutionScope.unitSpellEffectPointScope(
JassGameEventsWar3.EVENT_PLAYER_UNIT_SPELL_EFFECT, event.getTrigger(), spellAbilityUnit,
abilityPointTarget, alias));
JassGameEventsWar3.EVENT_PLAYER_UNIT_SPELL_EFFECT, event.getTrigger(), spellAbility,
spellAbilityUnit, abilityPointTarget, alias));
}
}
}

View File

@ -274,7 +274,9 @@ public enum JassGameEventsWar3 implements CHandle {
EVENT_UNIT_STACK_ITEM,
// use TriggerRegisterPlayerUnitEvent
EVENT_PLAYER_UNIT_STACK_ITEM,;
EVENT_PLAYER_UNIT_STACK_ITEM,
;
private static final int TFT_CUTOFF = EVENT_GAME_LOADED.ordinal();

View File

@ -5,6 +5,8 @@ import com.etheller.warsmash.util.War3ID;
public interface AbilityActivationReceiver {
void useOk();
void unknownReasonUseNotOk();
void notEnoughResources(ResourceType resource);
void notAnActiveAbility();
@ -24,4 +26,6 @@ public interface AbilityActivationReceiver {
void techtreeMaximumReached();
void cooldownNotYetReady(float cooldownRemaining, float cooldown);
void noChargesRemaining();
}

View File

@ -11,6 +11,11 @@ public class BooleanAbilityActivationReceiver implements AbilityActivationReceiv
this.ok = true;
}
@Override
public void unknownReasonUseNotOk() {
this.ok = false;
}
@Override
public void notEnoughResources(final ResourceType resource) {
this.ok = false;
@ -61,6 +66,11 @@ public class BooleanAbilityActivationReceiver implements AbilityActivationReceiv
this.ok = false;
}
@Override
public void noChargesRemaining() {
this.ok = false;
}
public boolean isOk() {
return this.ok;
}

View File

@ -44,6 +44,11 @@ public class MeleeUIAbilityActivationReceiver implements AbilityActivationReceiv
this.ok = true;
}
@Override
public void unknownReasonUseNotOk() {
this.genericError.onClick(this.commandErrorListener, this.worldSceneAudioContext, this.commandedUnit);
}
@Override
public void notEnoughResources(final ResourceType resource) {
switch (resource) {
@ -107,6 +112,11 @@ public class MeleeUIAbilityActivationReceiver implements AbilityActivationReceiv
this.genericError.onClick(this.commandErrorListener, this.worldSceneAudioContext, this.commandedUnit);
}
@Override
public void noChargesRemaining() {
this.genericError.onClick(this.commandErrorListener, this.worldSceneAudioContext, this.commandedUnit);
}
public boolean isUseOk() {
return this.ok;
}

View File

@ -25,6 +25,11 @@ public class StringMsgAbilityActivationReceiver implements AbilityActivationRece
this.useOk = true;
}
@Override
public void unknownReasonUseNotOk() {
this.message = "NOTEXTERN: Unable to use this ability.";
}
@Override
public void notEnoughResources(final ResourceType resource) {
this.message = "NOTEXTERN: Requires more " + resource.name().toLowerCase() + ".";
@ -75,4 +80,9 @@ public class StringMsgAbilityActivationReceiver implements AbilityActivationRece
this.message = "NOTEXTERN: Ability is disabled.";
}
@Override
public void noChargesRemaining() {
this.message = "NOTEXTERN: No charges remaining.";
}
}

View File

@ -138,6 +138,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.harvest.C
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.hero.CAbilityHero;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.hero.CPrimaryAttribute;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.inventory.CAbilityInventory;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.jass.CAbilityJass;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.mine.CAbilityGoldMine;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityQueue;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAbilityRally;
@ -145,6 +146,8 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAb
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;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass.CAbilityTypeJassDefinition;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.types.jass.CAbilityTypeJassDefinition.JassOrder;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.upgrade.CAbilityUpgrade;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CAttackType;
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.CDefenseType;
@ -1957,6 +1960,24 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma
return null;
}
@Override
public Void accept(final CAbilityJass ability) {
final CAbilityTypeJassDefinition type = ability.getType();
// TODO getting icon from type is currently inefficient
final JassOrder orderCommandCardIcon = type.getOrderCommandCardIcon(MeleeUI.this.war3MapViewer.simulation,
MeleeUI.this.selectedUnit.getSimulationUnit(), MeleeUI.this.activeCommandOrderId);
if (orderCommandCardIcon.getMouseTargetRadius() > 0) {
handlePlacementCursor(ability, orderCommandCardIcon.getMouseTargetRadius());
}
else if (orderCommandCardIcon.getPreviewBuildUnitId() != null) {
handleBuildCursor(null, orderCommandCardIcon.getPreviewBuildUnitId().getValue());
}
else {
handleTargetCursor(ability);
}
return null;
}
private void handleTargetCursor(final CAbility ability) {
if (MeleeUI.this.cursorModelInstance != null) {
MeleeUI.this.cursorModelInstance.detach();
@ -1967,11 +1988,15 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma
}
private void handleBuildCursor(final AbstractCAbilityBuild ability) {
handleBuildCursor(ability, MeleeUI.this.activeCommandOrderId);
}
private void handleBuildCursor(final AbstractCAbilityBuild ability, final int previewBuildUnitId) {
boolean justLoaded = false;
final War3MapViewer viewer = MeleeUI.this.war3MapViewer;
if (MeleeUI.this.cursorModelInstance == null) {
final MutableObjectData unitData = viewer.getAllObjectData().getUnits();
final War3ID buildingTypeId = new War3ID(MeleeUI.this.activeCommandOrderId);
final War3ID buildingTypeId = new War3ID(previewBuildUnitId);
MeleeUI.this.cursorBuildingUnitType = viewer.simulation.getUnitData().getUnitType(buildingTypeId);
final String unitModelPath = viewer.getUnitModelPath(unitData.get(buildingTypeId));
final MdxModel model = viewer.loadModelMdx(unitModelPath);
@ -3084,16 +3109,21 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma
boolean match = false;
switch (WarsmashConstants.INPUT_HOTKEY_MODE) {
case 0:
if (this.commandCard[j][i].checkHotkey(c, keycode)) match = true;
if (this.commandCard[j][i].checkHotkey(c, keycode)) {
match = true;
}
break;
case 1:
if(keycode == this.commandCardGridHotkeys[j][i]) match = true;
if (keycode == this.commandCardGridHotkeys[j][i]) {
match = true;
}
break;
}
if (match) {
this.commandCard[j][i].onClick(Input.Buttons.LEFT);
this.war3MapViewer.getUiSounds().getSound("InterfaceClick").play(this.uiScene.audioContext, 0, 0,0);
this.war3MapViewer.getUiSounds().getSound("InterfaceClick").play(this.uiScene.audioContext, 0, 0,
0);
}
}
}
@ -4132,4 +4162,16 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma
scriptDialog.positionBounds(this.rootFrame, this.uiViewport);
dialog.reset(scriptDialog, scriptDialogTextFrame);
}
public void removedUnit(final CUnit whichUnit) {
final RenderUnit renderUnit = this.war3MapViewer.getRenderPeer(whichUnit);
if ((this.selectedUnits != null) && this.selectedUnits.contains(renderUnit)) {
final List<RenderUnit> newSelectedUnits = new ArrayList<>(this.selectedUnits);
newSelectedUnits.remove(renderUnit);
selectUnits(newSelectedUnits);
}
else if (this.selectedUnit == renderUnit) {
selectUnit(null);
}
}
}