Skip to content

Commit 646e91a

Browse files
committed
Implemented more Ability Builder functions for listeners, and created Critical Strike/Evasion/Drunken Brawler
1 parent 123fffb commit 646e91a

33 files changed

Lines changed: 727 additions & 42 deletions

core/assets/BehaviorsConfigFile.json

Lines changed: 235 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@
251251
}
252252
},
253253
"thenActions": [{
254-
"type": "multiplyDamageMultiplier",
254+
"type": "multiplyDamageTakenMultiplier",
255255
"multiplier": {
256256
"type": "getAbilityDataAsFloat",
257257
"dataField": "B"
@@ -352,5 +352,239 @@
352352
"type": "getLastCreatedDamageTakenModificationListener"
353353
}
354354
}]
355+
},{
356+
"ids": [{"id":"AHbh"},{"id":"AOcr"},{"id":"ANdb"}],
357+
"type": "PASSIVE",
358+
"onAddAbility": [{
359+
"type": "createAttackPreDamageListener",
360+
"actions": [{
361+
"type": "if",
362+
"condition": {
363+
"type": "and",
364+
"condition1": {
365+
"type": "isValidTarget",
366+
"target": {
367+
"type": "getAttackedUnit"
368+
}
369+
},
370+
"condition2": {
371+
"type": "floatLt",
372+
"value1": {
373+
"type": "randomBoundedFloat",
374+
"bound": {
375+
"type": "rawFloat",
376+
"value": 100
377+
}
378+
},
379+
"value2": {
380+
"type": "getAbilityDataAsFloat",
381+
"dataField": "A"
382+
}
383+
}
384+
},
385+
"thenActions": [{
386+
"type": "if",
387+
"condition": {
388+
"type": "floatNe0",
389+
"value": {
390+
"type": "getAbilityDataAsFloat",
391+
"dataField": "B"
392+
}
393+
},
394+
"thenActions": [{
395+
"type": "addDamageDealtMultiplier",
396+
"value": {
397+
"type": "getAbilityDataAsFloat",
398+
"dataField": "B"
399+
}
400+
401+
}],
402+
"elseActions": []
403+
},{
404+
"type": "addBonusDamageDealt",
405+
"value": {
406+
"type": "getAbilityDataAsFloat",
407+
"dataField": "C"
408+
}
409+
},{
410+
"type": "addStunBuff",
411+
"target": {
412+
"type": "getAttackedUnit"
413+
},
414+
"buffId": {
415+
"type": "getFirstBuffId"
416+
},
417+
"duration": {
418+
"type": "getAbilityDuration",
419+
"target": {
420+
"type": "getAttackedUnit"
421+
}
422+
}
423+
},{
424+
"type": "setStacking",
425+
"allowStacking": {
426+
"type": "rawBoolean",
427+
"value": "false"
428+
},
429+
"allowSamePriorityStacking": {
430+
"type": "rawBoolean",
431+
"value": "false"
432+
}
433+
}],
434+
"elseActions": []
435+
}]
436+
},{
437+
"type": "addAttackPreDamageListener",
438+
"targetUnit": {
439+
"type": "getCastingUnit"
440+
},
441+
"priority": {
442+
"type": "rawPriority",
443+
"priority": "CRITBASH"
444+
},
445+
"listener": {
446+
"type": "getLastCreatedAttackPreDamageListener"
447+
}
448+
},{
449+
"type": "storeValueLocally",
450+
"key": {
451+
"type": "rawString",
452+
"value": "crit"
453+
},
454+
"valueToStore": {
455+
"type": "getLastCreatedAttackPreDamageListener"
456+
}
457+
},{
458+
"type": "createAttackPreDamageListener",
459+
"actions": [{
460+
"type": "if",
461+
"condition": {
462+
"type": "bool",
463+
"bool": {
464+
"type": "getAbilityDataAsBoolean",
465+
"dataField": "E"
466+
}
467+
},
468+
"thenActions": [{
469+
"type": "setStacking",
470+
"allowStacking": {
471+
"type": "rawBoolean",
472+
"value": "true"
473+
},
474+
"allowSamePriorityStacking": {
475+
"type": "rawBoolean",
476+
"value": "false"
477+
}
478+
}],
479+
"elseActions": []
480+
}]
481+
},{
482+
"type": "addAttackPreDamageListener",
483+
"targetUnit": {
484+
"type": "getCastingUnit"
485+
},
486+
"priority": {
487+
"type": "rawPriority",
488+
"priority": "ACCURACY"
489+
},
490+
"listener": {
491+
"type": "getLastCreatedAttackPreDamageListener"
492+
}
493+
},{
494+
"type": "storeValueLocally",
495+
"key": {
496+
"type": "rawString",
497+
"value": "nomiss"
498+
},
499+
"valueToStore": {
500+
"type": "getLastCreatedAttackPreDamageListener"
501+
}
502+
},{
503+
"type": "createEvasionListener",
504+
"conditions": [{
505+
"type": "floatlt",
506+
"value1": {
507+
"type": "randomFloat"
508+
},
509+
"value2": {
510+
"type": "getAbilityDataAsFloat",
511+
"dataField": "D"
512+
}
513+
}]
514+
},{
515+
"type": "addEvasionListener",
516+
"targetUnit": {
517+
"type": "getCastingUnit"
518+
},
519+
"listener": {
520+
"type": "getLastCreatedEvasionListener"
521+
}
522+
}],
523+
"onRemoveAbility": [{
524+
"type": "removeAttackPreDamageListener",
525+
"targetUnit": {
526+
"type": "getCastingUnit"
527+
},
528+
"listener": {
529+
"type": "getStoredAttackPreDamageListenerByKey",
530+
"key": {
531+
"type": "rawString",
532+
"value": "crit"
533+
}
534+
}
535+
},{
536+
"type": "removeAttackPreDamageListener",
537+
"targetUnit": {
538+
"type": "getCastingUnit"
539+
},
540+
"listener": {
541+
"type": "getStoredAttackPreDamageListenerByKey",
542+
"key": {
543+
"type": "rawString",
544+
"value": "nomiss"
545+
}
546+
}
547+
},{
548+
"type": "removeEvasionListener",
549+
"targetUnit": {
550+
"type": "getCastingUnit"
551+
},
552+
"listener": {
553+
"type": "getLastCreatedEvasionListener"
554+
}
555+
}]
556+
},{
557+
"ids": [{"id":"AEev"}],
558+
"type": "PASSIVE",
559+
"onAddAbility": [{
560+
"type": "createEvasionListener",
561+
"conditions": [{
562+
"type": "floatlt",
563+
"value1": {
564+
"type": "randomFloat"
565+
},
566+
"value2": {
567+
"type": "getAbilityDataAsFloat",
568+
"dataField": "A"
569+
}
570+
}]
571+
},{
572+
"type": "addEvasionListener",
573+
"targetUnit": {
574+
"type": "getCastingUnit"
575+
},
576+
"listener": {
577+
"type": "getLastCreatedEvasionListener"
578+
}
579+
}],
580+
"onRemoveAbility": [{
581+
"type": "removeEvasionListener",
582+
"targetUnit": {
583+
"type": "getCastingUnit"
584+
},
585+
"listener": {
586+
"type": "getLastCreatedEvasionListener"
587+
}
588+
}]
355589
}]
356590
}

core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/CUnit.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ public class CUnit extends CWidget {
202202
private List<CUnitAttack> unitSpecificCurrentAttacks;
203203
private boolean disableAttacks;
204204

205-
private Map<Integer, List<CUnitAttackPreDamageListener>> preDamageListeners = new HashMap<>();
205+
private Map<CUnitAttackPreDamageListenerPriority, List<CUnitAttackPreDamageListener>> preDamageListeners = new HashMap<>();
206206
private List<CUnitAttackPostDamageListener> postDamageListeners = new ArrayList<>();
207207
private List<CUnitAttackDamageTakenModificationListener> damageTakenModificationListeners = new ArrayList<>();
208208
private List<CUnitAttackDamageTakenListener> damageTakenListeners = new ArrayList<>();
@@ -243,7 +243,7 @@ public CUnit(final int handleId, final int playerIndex, final float x, final flo
243243
this.decays = unitType.isDecay();
244244
initializeNonStackingBuffs();
245245
initializeListenerLists();
246-
this.addPreDamageListener(CUnitAttackPreDamageListenerPriority.ACCURACY.getPriority(),
246+
this.addPreDamageListener(CUnitAttackPreDamageListenerPriority.ACCURACY,
247247
new CUnitDefaultAccuracyCheckListener());
248248
computeAllDerivedFields();
249249
}
@@ -757,8 +757,8 @@ private void initializeNonStackingBuffs() {
757757
}
758758

759759
private void initializeListenerLists() {
760-
for (int i = CUnitAttackPreDamageListener.PRIORITY_MIN; i <= CUnitAttackPreDamageListener.PRIORITY_MAX; i++) {
761-
preDamageListeners.put(i, new ArrayList<>());
760+
for (CUnitAttackPreDamageListenerPriority priority : CUnitAttackPreDamageListenerPriority.values()) {
761+
preDamageListeners.put(priority, new ArrayList<>());
762762
}
763763
for (int i = CUnitDeathReplacementEffect.PRIORITY_MIN; i <= CUnitDeathReplacementEffect.PRIORITY_MAX; i++) {
764764
deathReplacementEffects.put(i, new ArrayList<>());
@@ -1729,7 +1729,6 @@ public float damage(final CSimulation simulation, final CUnit source, final bool
17291729

17301730
CUnitAttackDamageTakenModificationListenerDamageModResult result = new CUnitAttackDamageTakenModificationListenerDamageModResult(
17311731
damage, bonusDamage);
1732-
System.err.println("Reached mod listeners (" + damageTakenModificationListeners.size() + ")");
17331732
for (CUnitAttackDamageTakenModificationListener listener : damageTakenModificationListeners) {
17341733
listener.onDamage(simulation, source, this, isAttack, isRanged, attackType, damageType, result);
17351734
}
@@ -3384,22 +3383,19 @@ public boolean isExplodesOnDeath() {
33843383
return this.explodesOnDeath;
33853384
}
33863385

3387-
public List<CUnitAttackPreDamageListener> getPreDamageListenersForPriority(Integer priority) {
3388-
priority = Math.min(Math.max(priority, 10), 0);
3386+
public List<CUnitAttackPreDamageListener> getPreDamageListenersForPriority(CUnitAttackPreDamageListenerPriority priority) {
33893387
return preDamageListeners.get(priority);
33903388
}
33913389

3392-
public void addPreDamageListener(Integer priority, CUnitAttackPreDamageListener listener) {
3393-
priority = Math.min(Math.max(priority, 10), 0);
3390+
public void addPreDamageListener(CUnitAttackPreDamageListenerPriority priority, CUnitAttackPreDamageListener listener) {
33943391
List<CUnitAttackPreDamageListener> list = preDamageListeners.get(priority);
33953392
if (list == null) {
33963393
list = new ArrayList<>();
33973394
}
33983395
list.add(0, listener);
33993396
}
34003397

3401-
public void removePreDamageListener(Integer priority, CUnitAttackPreDamageListener listener) {
3402-
priority = Math.min(Math.max(priority, 10), 0);
3398+
public void removePreDamageListener(CUnitAttackPreDamageListenerPriority priority, CUnitAttackPreDamageListener listener) {
34033399
List<CUnitAttackPreDamageListener> list = preDamageListeners.get(priority);
34043400
if (list != null) {
34053401
list.remove(listener);
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.behavior.action;
2+
3+
import java.util.Map;
4+
5+
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CSimulation;
6+
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnit;
7+
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbility;
8+
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.skills.util.CBuffStun;
9+
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.behavior.callback.floatcallbacks.ABFloatCallback;
10+
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.behavior.callback.idcallbacks.ABIDCallback;
11+
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.behavior.callback.unitcallbacks.ABUnitCallback;
12+
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.core.ABAction;
13+
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.core.ABLocalStoreKeys;
14+
15+
public class ABActionAddStunBuff implements ABAction {
16+
17+
private ABUnitCallback target;
18+
private ABIDCallback buffId;
19+
private ABFloatCallback duration;
20+
21+
public void runAction(final CSimulation game, final CUnit caster, final Map<String, Object> localStore) {
22+
CAbility ability = new CBuffStun(game.getHandleIdAllocator().createId(),
23+
buffId.callback(game, caster, localStore), duration.callback(game, caster, localStore));
24+
target.callback(game, caster, localStore).add(game, ability);
25+
localStore.put(ABLocalStoreKeys.LASTADDEDBUFF, ability);
26+
}
27+
}

core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilitybuilder/behavior/action/unitlisteners/ABActionAddAttackPreDamageListener.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55

66
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CSimulation;
77
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnit;
8-
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.behavior.callback.integercallbacks.ABIntegerCallback;
8+
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.behavior.callback.enumcallbacks.ABAttackPreDamageListenerPriorityCallback;
99
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.behavior.callback.listenercallbacks.ABAttackPreDamageListenerCallback;
1010
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.behavior.callback.unitcallbacks.ABUnitCallback;
1111
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.core.ABAction;
1212

1313
public class ABActionAddAttackPreDamageListener implements ABAction {
1414

1515
private ABUnitCallback targetUnit;
16-
private ABIntegerCallback priority;
16+
private ABAttackPreDamageListenerPriorityCallback priority;
1717
private ABAttackPreDamageListenerCallback listener;
1818

1919
public void runAction(final CSimulation game, final CUnit caster, final Map<String, Object> localStore) {

core/src/com/etheller/warsmash/viewer5/handlers/w3x/simulation/abilitybuilder/behavior/action/unitlisteners/ABActionRemoveAttackPreDamageListener.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55

66
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CSimulation;
77
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnit;
8-
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.behavior.callback.integercallbacks.ABIntegerCallback;
8+
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.behavior.callback.enumcallbacks.ABAttackPreDamageListenerPriorityCallback;
99
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.behavior.callback.listenercallbacks.ABAttackPreDamageListenerCallback;
1010
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.behavior.callback.unitcallbacks.ABUnitCallback;
1111
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilitybuilder.core.ABAction;
1212

1313
public class ABActionRemoveAttackPreDamageListener implements ABAction {
1414

1515
private ABUnitCallback targetUnit;
16-
private ABIntegerCallback priority;
16+
private ABAttackPreDamageListenerPriorityCallback priority;
1717
private ABAttackPreDamageListenerCallback buff;
1818

1919
public void runAction(final CSimulation game, final CUnit caster, final Map<String, Object> localStore) {

0 commit comments

Comments
 (0)