@firestone-hs/simulate-bgs-battle 1.1.737 → 1.1.739
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bgs-player-entity.d.ts +5 -0
- package/dist/bgs-player-entity.js.map +1 -1
- package/dist/cards/card.interface.d.ts +4 -0
- package/dist/cards/card.interface.js +4 -2
- package/dist/cards/card.interface.js.map +1 -1
- package/dist/cards/cards-data.d.ts +1 -0
- package/dist/cards/cards-data.js +71 -36
- package/dist/cards/cards-data.js.map +1 -1
- package/dist/cards/impl/_card-mappings.js +4 -0
- package/dist/cards/impl/_card-mappings.js.map +1 -1
- package/dist/cards/impl/enchantments/demonology.d.ts +2 -0
- package/dist/cards/impl/enchantments/demonology.js +14 -0
- package/dist/cards/impl/enchantments/demonology.js.map +1 -0
- package/dist/cards/impl/enchantments/fresh-perspective.d.ts +2 -0
- package/dist/cards/impl/enchantments/fresh-perspective.js +15 -0
- package/dist/cards/impl/enchantments/fresh-perspective.js.map +1 -0
- package/dist/cards/impl/minion/abyssal-bruiser.js +8 -5
- package/dist/cards/impl/minion/abyssal-bruiser.js.map +1 -1
- package/dist/cards/impl/minion/beetle.js +2 -1
- package/dist/cards/impl/minion/beetle.js.map +1 -1
- package/dist/cards/impl/minion/bellowing-tyrant.js +2 -1
- package/dist/cards/impl/minion/bellowing-tyrant.js.map +1 -1
- package/dist/cards/impl/minion/falling-sky-golem.js +2 -1
- package/dist/cards/impl/minion/falling-sky-golem.js.map +1 -1
- package/dist/cards/impl/minion/flourishing-frostling.js +4 -5
- package/dist/cards/impl/minion/flourishing-frostling.js.map +1 -1
- package/dist/cards/impl/minion/malorne.js +2 -1
- package/dist/cards/impl/minion/malorne.js.map +1 -1
- package/dist/cards/impl/minion/maritime-extortionist.js +2 -1
- package/dist/cards/impl/minion/maritime-extortionist.js.map +1 -1
- package/dist/cards/impl/minion/raptor-elder.js +2 -1
- package/dist/cards/impl/minion/raptor-elder.js.map +1 -1
- package/dist/cards/impl/minion/showy-cyclist.d.ts +2 -2
- package/dist/cards/impl/minion/showy-cyclist.js +1 -0
- package/dist/cards/impl/minion/showy-cyclist.js.map +1 -1
- package/dist/cards/impl/minion/spellbound-soul.js +2 -1
- package/dist/cards/impl/minion/spellbound-soul.js.map +1 -1
- package/dist/cards/impl/minion/timewarped-recycler.js +4 -0
- package/dist/cards/impl/minion/timewarped-recycler.js.map +1 -1
- package/dist/cards/impl/minion/timewarped-traveler.js +7 -1
- package/dist/cards/impl/minion/timewarped-traveler.js.map +1 -1
- package/dist/cards/impl/trinket/soul-fermenter.js +1 -1
- package/dist/cards/impl/trinket/soul-fermenter.js.map +1 -1
- package/dist/input-sanitation.js +12 -9
- package/dist/input-sanitation.js.map +1 -1
- package/dist/mechanics/rally.js +6 -3
- package/dist/mechanics/rally.js.map +1 -1
- package/dist/simulate-bgs-battle.d.ts +8 -0
- package/dist/simulate-bgs-battle.js +124 -21
- package/dist/simulate-bgs-battle.js.map +1 -1
- package/dist/simulation/after-attack.d.ts +1 -1
- package/dist/simulation/after-attack.js +21 -21
- package/dist/simulation/after-attack.js.map +1 -1
- package/dist/simulation/attack.d.ts +1 -0
- package/dist/simulation/attack.js +1 -1
- package/dist/simulation/attack.js.map +1 -1
- package/dist/simulation/auras.js +24 -6
- package/dist/simulation/auras.js.map +1 -1
- package/dist/simulation/combat-profile.d.ts +13 -0
- package/dist/simulation/combat-profile.js +37 -0
- package/dist/simulation/combat-profile.js.map +1 -0
- package/dist/simulation/death-effects.js +16 -0
- package/dist/simulation/death-effects.js.map +1 -1
- package/dist/simulation/internal-game-state.d.ts +1 -0
- package/dist/simulation/internal-game-state.js.map +1 -1
- package/dist/simulation/reborn.js +6 -0
- package/dist/simulation/reborn.js.map +1 -1
- package/dist/simulation/simulator.js +88 -20
- package/dist/simulation/simulator.js.map +1 -1
- package/dist/simulation/spectator/spectator.d.ts +1 -0
- package/dist/simulation/spectator/spectator.js +22 -6
- package/dist/simulation/spectator/spectator.js.map +1 -1
- package/dist/simulation/start-of-combat/soc-action-processor.js +10 -0
- package/dist/simulation/start-of-combat/soc-action-processor.js.map +1 -1
- package/dist/simulation/utils/entity-utils.d.ts +1 -0
- package/dist/simulation/utils/entity-utils.js +5 -1
- package/dist/simulation/utils/entity-utils.js.map +1 -1
- package/dist/single-simulation-result.d.ts +36 -0
- package/dist/single-simulation-result.js.map +1 -1
- package/dist/utils.js +17 -18
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
|
@@ -20,7 +20,8 @@ exports.BellowingTyrant = {
|
|
|
20
20
|
minion.attack = Math.max(0, minion.attack - bellowingTyrantAttack * mult * input.hero.globalInfo.BeastsSummonedThisGame);
|
|
21
21
|
}
|
|
22
22
|
if (input.applyHealthAuras) {
|
|
23
|
-
|
|
23
|
+
const minHealth = Math.min(minion.health, 1);
|
|
24
|
+
minion.health = Math.max(minHealth, minion.health - bellowingTyrantHealth * mult * input.hero.globalInfo.BeastsSummonedThisGame);
|
|
24
25
|
}
|
|
25
26
|
},
|
|
26
27
|
onOtherSpawned: (minion, input) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bellowing-tyrant.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/bellowing-tyrant.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,qDAAwD;AACxD,0CAAiD;AAGjD,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEnB,QAAA,eAAe,GAAyD;IACpF,OAAO,EAAE,0BAAsE;IAC/E,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;QACvD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,IAAI,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC;QACvE,IAAA,mBAAW,EACV,MAAM,EACN,MAAM,EACN,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EAC/D,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EAC/D,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,CACf,CAAC;IACH,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM,GAAG,qBAAqB,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAC3F,CAAC;SACF;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,
|
|
1
|
+
{"version":3,"file":"bellowing-tyrant.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/bellowing-tyrant.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,qDAAwD;AACxD,0CAAiD;AAGjD,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEnB,QAAA,eAAe,GAAyD;IACpF,OAAO,EAAE,0BAAsE;IAC/E,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;QACvD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,IAAI,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC;QACvE,IAAA,mBAAW,EACV,MAAM,EACN,MAAM,EACN,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EAC/D,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EAC/D,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,CACf,CAAC;IACH,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM,GAAG,qBAAqB,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAC3F,CAAC;SACF;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,SAAS,EACT,MAAM,CAAC,MAAM,GAAG,qBAAqB,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAC3F,CAAC;SACF;IACF,CAAC;IACD,cAAc,EAAE,CAAC,MAAmB,EAAE,KAAwB,EAAE,EAAE;QACjE,IACC,CAAC,IAAA,uBAAe,EAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,qBAAI,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAC3G;YACD,OAAO;SACP;QACD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,IAAI,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC;QAC5B,IAAA,mBAAW,EACV,MAAM,EACN,MAAM,EACN,qBAAqB,GAAG,UAAU,EAClC,qBAAqB,GAAG,UAAU,EAClC,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,CACf,CAAC;IACH,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnDespawnInput, OnOtherSpawnInput, OnSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { OnDespawnedCard, OnOtherSpawnedCard, OnSpawnedCard } from '../../card.interface';\r\n\r\nconst bellowingTyrantAttack = 4;\r\nconst bellowingTyrantHealth = 3;\r\n\r\nexport const BellowingTyrant: OnSpawnedCard & OnOtherSpawnedCard & OnDespawnedCard = {\r\n\tcardIds: [CardIds.BellowingTyrant_BG31_361, CardIds.BellowingTyrant_BG31_361_G],\r\n\tonSpawned: (minion: BoardEntity, input: OnSpawnInput) => {\r\n\t\tinput.hero.globalInfo.BeastsSummonedThisGame += 1;\r\n\t\tconst mult = minion.cardId === CardIds.BellowingTyrant_BG31_361_G ? 2 : 1;\r\n\t\tconst statsBonus = mult * input.hero.globalInfo.BeastsSummonedThisGame;\r\n\t\tmodifyStats(\r\n\t\t\tminion,\r\n\t\t\tminion,\r\n\t\t\tinput.applyAttackAuras ? bellowingTyrantAttack * statsBonus : 0,\r\n\t\t\tinput.applyHealthAuras ? bellowingTyrantHealth * statsBonus : 0,\r\n\t\t\tinput.board,\r\n\t\t\tinput.hero,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t},\r\n\tonDespawned: (minion: BoardEntity, input: OnDespawnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.BellowingTyrant_BG31_361_G ? 2 : 1;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tminion.attack - bellowingTyrantAttack * mult * input.hero.globalInfo.BeastsSummonedThisGame,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tconst minHealth = Math.min(minion.health, 1);\r\n\t\t\tminion.health = Math.max(\r\n\t\t\t\tminHealth,\r\n\t\t\t\tminion.health - bellowingTyrantHealth * mult * input.hero.globalInfo.BeastsSummonedThisGame,\r\n\t\t\t);\r\n\t\t}\r\n\t},\r\n\tonOtherSpawned: (minion: BoardEntity, input: OnOtherSpawnInput) => {\r\n\t\tif (\r\n\t\t\t!hasCorrectTribe(input.spawned, input.hero, Race.BEAST, input.gameState.anomalies, input.gameState.allCards)\r\n\t\t) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tinput.hero.globalInfo.BeastsSummonedThisGame += 1;\r\n\t\tconst mult = minion.cardId === CardIds.BellowingTyrant_BG31_361_G ? 2 : 1;\r\n\t\tconst statsBonus = mult * 1;\r\n\t\tmodifyStats(\r\n\t\t\tminion,\r\n\t\t\tminion,\r\n\t\t\tbellowingTyrantAttack * statsBonus,\r\n\t\t\tbellowingTyrantHealth * statsBonus,\r\n\t\t\tinput.board,\r\n\t\t\tinput.hero,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t},\r\n};\r\n"]}
|
|
@@ -33,7 +33,8 @@ exports.FallingSkyGolem = {
|
|
|
33
33
|
minion.attack = Math.max(0, minion.attack - atk);
|
|
34
34
|
}
|
|
35
35
|
if (input.applyHealthAuras) {
|
|
36
|
-
|
|
36
|
+
const minHealth = Math.min(minion.health, 1);
|
|
37
|
+
minion.health = Math.max(minHealth, minion.health - hp);
|
|
37
38
|
}
|
|
38
39
|
},
|
|
39
40
|
onGlobalInfoUpdated: (minion, input) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"falling-sky-golem.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/falling-sky-golem.ts"],"names":[],"mappings":";;;AACA,mEAAqE;AAMxD,QAAA,eAAe,GAA8D;IACzF,OAAO,EAAE,0BAAsE;IAC/E,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,GAAG,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,6BAA6B,mCAAI,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;YACrB,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;SACjC;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;YACpB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7D;QACD,MAAM,SAAS,GACd,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI;YACrD,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM;YAC3C,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5C,IAAA,kCAAkB,EAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACvF,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,GAAG,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,6BAA6B,mCAAI,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;SACjD;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"falling-sky-golem.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/falling-sky-golem.ts"],"names":[],"mappings":";;;AACA,mEAAqE;AAMxD,QAAA,eAAe,GAA8D;IACzF,OAAO,EAAE,0BAAsE;IAC/E,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,GAAG,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,6BAA6B,mCAAI,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;YACrB,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;SACjC;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;YACpB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7D;QACD,MAAM,SAAS,GACd,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI;YACrD,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM;YAC3C,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5C,IAAA,kCAAkB,EAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACvF,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,GAAG,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,6BAA6B,mCAAI,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;SACjD;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;SACxD;IACF,CAAC;IACD,mBAAmB,EAAE,CAAC,MAAmB,EAAE,KAA+B,EAAE,EAAE;QAC7E,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,+BAA+B,EAAE;gBACnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1E,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;gBACrB,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;gBACpB,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;gBACrB,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;gBACjC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;gBACpB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;aAC7D;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { updateDivineShield } from '../../../keywords/divine-shield';\r\nimport { OnGlobalInfoUpdatedInput } from '../../../mechanics/player-global-effects';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnDespawnInput, OnSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { OnDespawnedCard, OnGlobalInfoUpdatedCard, OnSpawnedCard } from '../../card.interface';\r\n\r\nexport const FallingSkyGolem: OnDespawnedCard & OnSpawnedCard & OnGlobalInfoUpdatedCard = {\r\n\tcardIds: [CardIds.FallingSkyGolem_BG35_342, CardIds.FallingSkyGolem_BG35_342_G],\r\n\tonSpawned: (minion: BoardEntity, input: OnSpawnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.FallingSkyGolem_BG35_342_G ? 2 : 1;\r\n\t\tconst n = input.hero.globalInfo.DeathrattlesTriggeredThisGame ?? 0;\r\n\t\tconst atk = 4 * mult * n;\r\n\t\tconst hp = 2 * mult * n;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack += atk;\r\n\t\t\tminion.maxAttack = minion.attack;\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tminion.health += hp;\r\n\t\t\tminion.maxHealth = Math.max(minion.maxHealth, minion.health);\r\n\t\t}\r\n\t\tconst otherHero =\r\n\t\t\tinput.gameState.gameState.player.player === input.hero\r\n\t\t\t\t? input.gameState.gameState.opponent.player\r\n\t\t\t\t: input.gameState.gameState.player.player;\r\n\t\tupdateDivineShield(minion, input.board, input.hero, otherHero, true, input.gameState);\r\n\t},\r\n\tonDespawned: (minion: BoardEntity, input: OnDespawnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.FallingSkyGolem_BG35_342_G ? 2 : 1;\r\n\t\tconst n = input.hero.globalInfo.DeathrattlesTriggeredThisGame ?? 0;\r\n\t\tconst atk = 4 * mult * n;\r\n\t\tconst hp = 2 * mult * n;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack = Math.max(0, minion.attack - atk);\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tconst minHealth = Math.min(minion.health, 1);\r\n\t\t\tminion.health = Math.max(minHealth, minion.health - hp);\r\n\t\t}\r\n\t},\r\n\tonGlobalInfoUpdated: (minion: BoardEntity, input: OnGlobalInfoUpdatedInput) => {\r\n\t\tfor (const value of input.values) {\r\n\t\t\tif (value.type === 'DeathrattlesTriggeredThisGame') {\r\n\t\t\t\tconst mult = minion.cardId === CardIds.FallingSkyGolem_BG35_342_G ? 2 : 1;\r\n\t\t\t\tconst atk = 4 * mult;\r\n\t\t\t\tconst hp = 2 * mult;\r\n\t\t\t\tminion.attack += atk;\r\n\t\t\t\tminion.maxAttack = minion.attack;\r\n\t\t\t\tminion.health += hp;\r\n\t\t\t\tminion.maxHealth = Math.max(minion.maxHealth, minion.health);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -10,11 +10,9 @@ exports.FlourishingFrostling = {
|
|
|
10
10
|
const multiplierFrostling = minion.cardId === "BG26_537_G" ? 2 : 1;
|
|
11
11
|
const frostlingBonus = input.hero.globalInfo.FrostlingBonus;
|
|
12
12
|
(0, stats_1.modifyStats)(minion, null, input.applyAttackAuras
|
|
13
|
-
? (attackBaseValue * multiplierFrostling + input.hero.globalInfo.ElementalAttackBuff) *
|
|
14
|
-
frostlingBonus
|
|
13
|
+
? (attackBaseValue * multiplierFrostling + input.hero.globalInfo.ElementalAttackBuff) * frostlingBonus
|
|
15
14
|
: 0, input.applyHealthAuras
|
|
16
|
-
? (healthBaseValue * multiplierFrostling + input.hero.globalInfo.ElementalHealthBuff) *
|
|
17
|
-
frostlingBonus
|
|
15
|
+
? (healthBaseValue * multiplierFrostling + input.hero.globalInfo.ElementalHealthBuff) * frostlingBonus
|
|
18
16
|
: 0, input.board, input.hero, input.gameState, false);
|
|
19
17
|
},
|
|
20
18
|
onDespawned: (minion, input) => {
|
|
@@ -26,7 +24,8 @@ exports.FlourishingFrostling = {
|
|
|
26
24
|
frostlingBonus);
|
|
27
25
|
}
|
|
28
26
|
if (input.applyHealthAuras) {
|
|
29
|
-
|
|
27
|
+
const minHealth = Math.min(minion.health, 1);
|
|
28
|
+
minion.health = Math.max(minHealth, minion.health -
|
|
30
29
|
(healthBaseValue * multiplierFrostling + input.hero.globalInfo.ElementalHealthBuff) *
|
|
31
30
|
frostlingBonus);
|
|
32
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flourishing-frostling.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/flourishing-frostling.ts"],"names":[],"mappings":";;;AAcA,qDAAwD;AAGxD,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,eAAe,GAAG,CAAC,CAAC;AAEb,QAAA,oBAAoB,GAA8D;IAC9F,OAAO,EAAE,0BAAgF;IACzF,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;QACvD,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAC5D,IAAA,mBAAW,EACV,MAAM,EACN,IAAI,EACJ,KAAK,CAAC,gBAAgB;YACrB,CAAC,CAAC,CAAC,eAAe,GAAG,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC
|
|
1
|
+
{"version":3,"file":"flourishing-frostling.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/flourishing-frostling.ts"],"names":[],"mappings":";;;AAcA,qDAAwD;AAGxD,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,eAAe,GAAG,CAAC,CAAC;AAEb,QAAA,oBAAoB,GAA8D;IAC9F,OAAO,EAAE,0BAAgF;IACzF,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;QACvD,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAC5D,IAAA,mBAAW,EACV,MAAM,EACN,IAAI,EACJ,KAAK,CAAC,gBAAgB;YACrB,CAAC,CAAC,CAAC,eAAe,GAAG,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,GAAG,cAAc;YACtG,CAAC,CAAC,CAAC,EACJ,KAAK,CAAC,gBAAgB;YACrB,CAAC,CAAC,CAAC,eAAe,GAAG,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,GAAG,cAAc;YACtG,CAAC,CAAC,CAAC,EACJ,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,EACf,KAAK,CACL,CAAC;IACH,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QAC3D,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAC5D,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM;gBACZ,CAAC,eAAe,GAAG,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;oBAClF,cAAc,CAChB,CAAC;SAMF;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,SAAS,EACT,MAAM,CAAC,MAAM;gBACZ,CAAC,eAAe,GAAG,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;oBAClF,cAAc,CAChB,CAAC;SAKF;IACF,CAAC;IACD,mBAAmB,EAAE,CAAC,MAAmB,EAAE,KAA+B,EAAE,EAAE;QAE7E,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE;gBACzC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;gBAC9C,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,cAAc,CAAC;gBACxC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;aACjC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE;gBACzC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;gBAC9C,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,cAAc,CAAC;gBACxC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;aAC7D;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Flourishing Frostling (Tier 5, 2/1)\r\n * Has +2/+1 for each Elemental you played this game (wherever this is).\r\n *\r\n * Golden Flourishing Frostling (Tier 5, 4/2)\r\n * Has +4/+2 for each Elemental you played this game (wherever this is).\r\n *\r\n * Elemental \"give an extra\" buffs add to the base, then multiply by FrostlingBonus.\r\n * Golden doubles only the base +2/+1, not ElementalAttackBuff / ElementalHealthBuff.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { OnGlobalInfoUpdatedInput } from '../../../mechanics/player-global-effects';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnDespawnInput, OnSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { OnDespawnedCard, OnGlobalInfoUpdatedCard, OnSpawnedCard } from '../../card.interface';\r\n\r\nconst attackBaseValue = 2;\r\nconst healthBaseValue = 1;\r\n\r\nexport const FlourishingFrostling: OnSpawnedCard & OnDespawnedCard & OnGlobalInfoUpdatedCard = {\r\n\tcardIds: [CardIds.FlourishingFrostling_BG26_537, CardIds.FlourishingFrostling_BG26_537_G],\r\n\tonSpawned: (minion: BoardEntity, input: OnSpawnInput) => {\r\n\t\tconst multiplierFrostling = minion.cardId === CardIds.FlourishingFrostling_BG26_537_G ? 2 : 1;\r\n\t\tconst frostlingBonus = input.hero.globalInfo.FrostlingBonus;\r\n\t\tmodifyStats(\r\n\t\t\tminion,\r\n\t\t\tnull,\r\n\t\t\tinput.applyAttackAuras\r\n\t\t\t\t? (attackBaseValue * multiplierFrostling + input.hero.globalInfo.ElementalAttackBuff) * frostlingBonus\r\n\t\t\t\t: 0,\r\n\t\t\tinput.applyHealthAuras\r\n\t\t\t\t? (healthBaseValue * multiplierFrostling + input.hero.globalInfo.ElementalHealthBuff) * frostlingBonus\r\n\t\t\t\t: 0,\r\n\t\t\tinput.board,\r\n\t\t\tinput.hero,\r\n\t\t\tinput.gameState,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t},\r\n\tonDespawned: (minion: BoardEntity, input: OnDespawnInput) => {\r\n\t\tconst multiplierFrostling = minion.cardId === CardIds.FlourishingFrostling_BG26_537_G ? 2 : 1;\r\n\t\tconst frostlingBonus = input.hero.globalInfo.FrostlingBonus;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tminion.attack -\r\n\t\t\t\t\t(attackBaseValue * multiplierFrostling + input.hero.globalInfo.ElementalAttackBuff) *\r\n\t\t\t\t\t\tfrostlingBonus,\r\n\t\t\t);\r\n\t\t\t// We need to keep track of the max attack even after death, in case stats need to be given\r\n\t\t\t// minion.maxAttack = Math.max(\r\n\t\t\t// \t0,\r\n\t\t\t// \tminion.maxAttack - (attackBaseValue + input.hero.globalInfo.ElementalAttackBuff) * statsBonusFrostling,\r\n\t\t\t// );\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tconst minHealth = Math.min(minion.health, 1);\r\n\t\t\tminion.health = Math.max(\r\n\t\t\t\tminHealth,\r\n\t\t\t\tminion.health -\r\n\t\t\t\t\t(healthBaseValue * multiplierFrostling + input.hero.globalInfo.ElementalHealthBuff) *\r\n\t\t\t\t\t\tfrostlingBonus,\r\n\t\t\t);\r\n\t\t\t// minion.maxHealth = Math.max(\r\n\t\t\t// \t1,\r\n\t\t\t// \tminion.maxHealth - (healthBaseValue + input.hero.globalInfo.ElementalHealthBuff) * statsBonusFrostling,\r\n\t\t\t// );\r\n\t\t}\r\n\t},\r\n\tonGlobalInfoUpdated: (minion: BoardEntity, input: OnGlobalInfoUpdatedInput) => {\r\n\t\t// Elemental buffs are not doubled by golden — only the card's base +2/+1 is.\r\n\t\tconst frostlingBonus = input.hero.globalInfo.FrostlingBonus;\r\n\t\tfor (const value of input.values) {\r\n\t\t\tif (value.type === 'ElementalAttackBuff') {\r\n\t\t\t\tconst delta = value.newValue - value.oldValue;\r\n\t\t\t\tminion.attack += delta * frostlingBonus;\r\n\t\t\t\tminion.maxAttack = minion.attack;\r\n\t\t\t}\r\n\t\t\tif (value.type === 'ElementalHealthBuff') {\r\n\t\t\t\tconst delta = value.newValue - value.oldValue;\r\n\t\t\t\tminion.health += delta * frostlingBonus;\r\n\t\t\t\tminion.maxHealth = Math.max(minion.maxHealth, minion.health);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -22,7 +22,8 @@ exports.Malorne = {
|
|
|
22
22
|
minion.attack = Math.max(0, minion.attack - baseBuff * mult);
|
|
23
23
|
}
|
|
24
24
|
if (input.applyHealthAuras) {
|
|
25
|
-
|
|
25
|
+
const minHealth = Math.min(minion.health, 1);
|
|
26
|
+
minion.health = Math.max(minHealth, minion.health - baseBuff * mult);
|
|
26
27
|
}
|
|
27
28
|
},
|
|
28
29
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"malorne.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/malorne.ts"],"names":[],"mappings":";;;AAKa,QAAA,OAAO,GAAoC;IACvD,OAAO,EAAE,gDAA4E;IACrF,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,4BAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC;SACjC;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC;SACjC;IACF,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,4BAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;SAC7D;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"malorne.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/malorne.ts"],"names":[],"mappings":";;;AAKa,QAAA,OAAO,GAAoC;IACvD,OAAO,EAAE,gDAA4E;IACrF,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,4BAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC;SACjC;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC;SACjC;IACF,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,4BAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;SAC7D;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;SACrE;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnDespawnInput, OnSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { OnDespawnedCard, OnSpawnedCard } from '../../card.interface';\r\n\r\nexport const Malorne: OnDespawnedCard & OnSpawnedCard = {\r\n\tcardIds: [CardIds.Malorne_BG32_HERO_001_Buddy, CardIds.Malorne_BG32_HERO_001_Buddy_G],\r\n\tonSpawned: (minion: BoardEntity, input: OnSpawnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.Malorne_BG32_HERO_001_Buddy_G ? 2 : 1;\r\n\t\tconst totalGoldSpent = input.hero.globalInfo.GoldSpentThisGame;\r\n\t\tconst baseBuff = Math.floor(totalGoldSpent / 3);\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack += baseBuff * mult;\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tminion.health += baseBuff * mult;\r\n\t\t}\r\n\t},\r\n\tonDespawned: (minion: BoardEntity, input: OnDespawnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.Malorne_BG32_HERO_001_Buddy_G ? 2 : 1;\r\n\t\tconst totalGoldSpent = input.hero.globalInfo.GoldSpentThisGame;\r\n\t\tconst baseBuff = Math.floor(totalGoldSpent / 3);\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack = Math.max(0, minion.attack - baseBuff * mult);\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tconst minHealth = Math.min(minion.health, 1);\r\n\t\t\tminion.health = Math.max(minHealth, minion.health - baseBuff * mult);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -25,7 +25,8 @@ exports.MaritimeExtortionist = {
|
|
|
25
25
|
minion.maxAttack = Math.max(minion.maxAttack, minion.attack);
|
|
26
26
|
}
|
|
27
27
|
if (input.applyHealthAuras) {
|
|
28
|
-
|
|
28
|
+
const minHealth = Math.min(minion.health, 1);
|
|
29
|
+
minion.health = Math.max(minHealth, minion.health - n * mult * 8);
|
|
29
30
|
minion.maxHealth = Math.max(minion.maxHealth, minion.health);
|
|
30
31
|
}
|
|
31
32
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maritime-extortionist.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/maritime-extortionist.ts"],"names":[],"mappings":";;;AAKa,QAAA,oBAAoB,GAAoC;IACpE,OAAO,EAAE,0BAAgF;IACzF,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,2BAA2B,mCAAI,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YAC9B,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;SACjC;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YAC9B,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7D;IACF,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,2BAA2B,mCAAI,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7D;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"maritime-extortionist.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/maritime-extortionist.ts"],"names":[],"mappings":";;;AAKa,QAAA,oBAAoB,GAAoC;IACpE,OAAO,EAAE,0BAAgF;IACzF,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,2BAA2B,mCAAI,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YAC9B,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;SACjC;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YAC9B,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7D;IACF,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,2BAA2B,mCAAI,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7D;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;YAClE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7D;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnDespawnInput, OnSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { OnDespawnedCard, OnSpawnedCard } from '../../card.interface';\r\n\r\nexport const MaritimeExtortionist: OnDespawnedCard & OnSpawnedCard = {\r\n\tcardIds: [CardIds.MaritimeExtortionist_BG36_524, CardIds.MaritimeExtortionist_BG36_524_G],\r\n\tonSpawned: (minion: BoardEntity, input: OnSpawnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.MaritimeExtortionist_BG36_524_G ? 2 : 1;\r\n\t\tconst n = input.hero.globalInfo.GoldenMinionsPlayedThisGame ?? 0;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack += n * mult * 8;\r\n\t\t\tminion.maxAttack = minion.attack;\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tminion.health += n * mult * 8;\r\n\t\t\tminion.maxHealth = Math.max(minion.maxHealth, minion.health);\r\n\t\t}\r\n\t},\r\n\tonDespawned: (minion: BoardEntity, input: OnDespawnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.MaritimeExtortionist_BG36_524_G ? 2 : 1;\r\n\t\tconst n = input.hero.globalInfo.GoldenMinionsPlayedThisGame ?? 0;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack = Math.max(0, minion.attack - n * mult * 8);\r\n\t\t\tminion.maxAttack = Math.max(minion.maxAttack, minion.attack);\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tconst minHealth = Math.min(minion.health, 1);\r\n\t\t\tminion.health = Math.max(minHealth, minion.health - n * mult * 8);\r\n\t\t\tminion.maxHealth = Math.max(minion.maxHealth, minion.health);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -32,7 +32,8 @@ exports.RaptorElder = {
|
|
|
32
32
|
target.attack = Math.max(0, target.attack - attackBuff * baseBuff);
|
|
33
33
|
}
|
|
34
34
|
if (input.applyHealthAuras) {
|
|
35
|
-
|
|
35
|
+
const minHealth = Math.min(target.health, 1);
|
|
36
|
+
target.health = Math.max(minHealth, target.health - healthBuff * baseBuff);
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
39
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raptor-elder.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/raptor-elder.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,0CAAiD;AAGjD,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,UAAU,GAAG,CAAC,CAAC;AAER,QAAA,WAAW,GAAyD;IAChF,OAAO,EAAE,0BAA8D;IACvE,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACvE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK;aAEzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,IAAA,uBAAe,EAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,qBAAI,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAC/F,CAAC;QACH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,IAAI,KAAK,CAAC,gBAAgB,EAAE;gBAC3B,MAAM,CAAC,MAAM,IAAI,UAAU,GAAG,QAAQ,CAAC;aACvC;YACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;gBAC3B,MAAM,CAAC,MAAM,IAAI,UAAU,GAAG,QAAQ,CAAC;aACvC;SACD;IACF,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACvE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC;aAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,IAAA,uBAAe,EAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,qBAAI,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAC/F,CAAC;QACH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,IAAI,KAAK,CAAC,gBAAgB,EAAE;gBAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC;aACnE;YACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;gBAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"raptor-elder.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/raptor-elder.ts"],"names":[],"mappings":"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","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnDespawnInput, OnOtherSpawnInput, OnSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { OnDespawnedCard, OnOtherSpawnedCard, OnSpawnedCard } from '../../card.interface';\r\n\r\nconst attackBuff = 3;\r\nconst healthBuff = 2;\r\n\r\nexport const RaptorElder: OnSpawnedCard & OnOtherSpawnedCard & OnDespawnedCard = {\r\n\tcardIds: [CardIds.RaptorElder_BG33_842, CardIds.RaptorElder_BG33_842_G],\r\n\tonSpawned: (minion: BoardEntity, input: OnSpawnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.RaptorElder_BG33_842_G ? 2 : 1;\r\n\t\tconst baseBuff = input.hero.globalInfo.BeastsSummonedThisCombat * mult;\r\n\t\tconst targets = input.board\r\n\t\t\t// .filter((e) => e !== minion)\r\n\t\t\t.filter((e) =>\r\n\t\t\t\thasCorrectTribe(e, input.hero, Race.BEAST, input.gameState.anomalies, input.gameState.allCards),\r\n\t\t\t);\r\n\t\tfor (const target of targets) {\r\n\t\t\tif (input.applyAttackAuras) {\r\n\t\t\t\ttarget.attack += attackBuff * baseBuff;\r\n\t\t\t}\r\n\t\t\tif (input.applyHealthAuras) {\r\n\t\t\t\ttarget.health += healthBuff * baseBuff;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tonDespawned: (minion: BoardEntity, input: OnDespawnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.RaptorElder_BG33_842_G ? 2 : 1;\r\n\t\tconst baseBuff = input.hero.globalInfo.BeastsSummonedThisCombat * mult;\r\n\t\tconst targets = input.board\r\n\t\t\t.filter((e) => e !== minion)\r\n\t\t\t.filter((e) =>\r\n\t\t\t\thasCorrectTribe(e, input.hero, Race.BEAST, input.gameState.anomalies, input.gameState.allCards),\r\n\t\t\t);\r\n\t\tfor (const target of targets) {\r\n\t\t\tif (input.applyAttackAuras) {\r\n\t\t\t\ttarget.attack = Math.max(0, target.attack - attackBuff * baseBuff);\r\n\t\t\t}\r\n\t\t\tif (input.applyHealthAuras) {\r\n\t\t\t\tconst minHealth = Math.min(target.health, 1);\r\n\t\t\t\ttarget.health = Math.max(minHealth, target.health - healthBuff * baseBuff);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tonOtherSpawned: (minion: BoardEntity, input: OnOtherSpawnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.RaptorElder_BG33_842_G ? 2 : 1;\r\n\t\tconst baseBuff = input.hero.globalInfo.BeastsSummonedThisCombat * mult;\r\n\t\t// First put the minion itself in the aura\r\n\t\tif (\r\n\t\t\tinput.applySelfAuras &&\r\n\t\t\thasCorrectTribe(input.spawned, input.hero, Race.BEAST, input.gameState.anomalies, input.gameState.allCards)\r\n\t\t) {\r\n\t\t\tinput.spawned.attack += attackBuff * baseBuff;\r\n\t\t\tinput.spawned.health += healthBuff * baseBuff;\r\n\t\t}\r\n\r\n\t\t// Then update the aura\r\n\t\tif (\r\n\t\t\thasCorrectTribe(input.spawned, input.hero, Race.BEAST, input.gameState.anomalies, input.gameState.allCards)\r\n\t\t) {\r\n\t\t\tconst allTargets = input.board.filter((e) =>\r\n\t\t\t\thasCorrectTribe(e, input.hero, Race.BEAST, input.gameState.anomalies, input.gameState.allCards),\r\n\t\t\t);\r\n\t\t\tfor (const target of allTargets) {\r\n\t\t\t\t// Only the new spawn should increase the data, as we've already applied the aura before\r\n\t\t\t\ttarget.attack += attackBuff * mult;\r\n\t\t\t\ttarget.health += healthBuff * mult;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { DeathrattleSpawnCard } from '../../card.interface';
|
|
2
|
-
export declare const ShowyCyclist: DeathrattleSpawnCard;
|
|
1
|
+
import { DeathrattleSpawnCard, RebornSelfAttributeTransferCard } from '../../card.interface';
|
|
2
|
+
export declare const ShowyCyclist: DeathrattleSpawnCard & RebornSelfAttributeTransferCard;
|
|
@@ -5,6 +5,7 @@ const reference_data_1 = require("@firestone-hs/reference-data");
|
|
|
5
5
|
const utils_1 = require("../../../utils");
|
|
6
6
|
exports.ShowyCyclist = {
|
|
7
7
|
cardIds: ["BG31_925", "BG31_925_G"],
|
|
8
|
+
rebornSelfAttributeTransfer: ['scriptDataNum2'],
|
|
8
9
|
deathrattleSpawn: (minion, input) => {
|
|
9
10
|
var _a;
|
|
10
11
|
const base = minion.cardId === "BG31_925_G" ? 4 : 2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"showy-cyclist.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/showy-cyclist.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,0CAAiD;AAGpC,QAAA,YAAY,
|
|
1
|
+
{"version":3,"file":"showy-cyclist.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/showy-cyclist.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,0CAAiD;AAGpC,QAAA,YAAY,GAA2D;IACnF,OAAO,EAAE,0BAAgE;IAEzE,2BAA2B,EAAE,CAAC,gBAAgB,CAAC;IAC/C,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAIvE,MAAM,QAAQ,GAAG,MAAA,MAAM,CAAC,cAAc,mCAAI,IAAI,CAAC;QAE/C,MAAM,IAAI,GAAG,CAAC,CAAC;QACf,MAAM,IAAI,GAAG,QAAQ,GAAG,IAAI,CAAC;QAC7B,IAAA,uBAAe,EACd,MAAM,EACN,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,IAAI,EACJ,IAAI,EACJ,KAAK,CAAC,SAAS,EACf,qBAAI,CAAC,qBAAI,CAAC,IAAI,CAAC,CACf,CAAC;QACF,OAAO,EAAE,CAAC;IACX,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { addStatsToBoard } from '../../../utils';\r\nimport { DeathrattleSpawnCard, RebornSelfAttributeTransferCard } from '../../card.interface';\r\n\r\nexport const ShowyCyclist: DeathrattleSpawnCard & RebornSelfAttributeTransferCard = {\r\n\tcardIds: [CardIds.ShowyCyclist_BG31_925, CardIds.ShowyCyclist_BG31_925_G],\r\n\t// https://replays.firestoneapp.com/?reviewId=58840660-bc38-41f3-8aee-9986e145c1aa&turn=23&action=14\r\n\trebornSelfAttributeTransfer: ['scriptDataNum2'],\r\n\tdeathrattleSpawn: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst base = minion.cardId === CardIds.ShowyCyclist_BG31_925_G ? 4 : 2;\r\n\t\t// Can be null when created in game\r\n\t\t// This is not exact, and the actual info should somehow come from the game state, but at least we\r\n\t\t// prevent issues\r\n\t\tconst baseBuff = minion.scriptDataNum2 ?? base;\r\n\t\t// The info is already included in the scriptDataNum2\r\n\t\tconst mult = 1;\r\n\t\tconst buff = baseBuff * mult;\r\n\t\taddStatsToBoard(\r\n\t\t\tminion,\r\n\t\t\tinput.boardWithDeadEntity,\r\n\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\tbuff,\r\n\t\t\tbuff,\r\n\t\t\tinput.gameState,\r\n\t\t\tRace[Race.NAGA],\r\n\t\t);\r\n\t\treturn [];\r\n\t},\r\n};\r\n"]}
|
|
@@ -20,7 +20,8 @@ exports.SpellboundSoul = {
|
|
|
20
20
|
minion.attack = Math.max(0, minion.attack - 2 * totalSpellsCast * mult);
|
|
21
21
|
}
|
|
22
22
|
if (input.applyHealthAuras) {
|
|
23
|
-
|
|
23
|
+
const minHealth = Math.min(minion.health, 1);
|
|
24
|
+
minion.health = Math.max(minHealth, minion.health - 1 * totalSpellsCast * mult);
|
|
24
25
|
}
|
|
25
26
|
},
|
|
26
27
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spellbound-soul.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/spellbound-soul.ts"],"names":[],"mappings":";;;AAKa,QAAA,cAAc,GAAoC;IAC9D,OAAO,EAAE,0BAAoE;IAC7E,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC;QACvE,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC;SAC5C;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC;SAC5C;IACF,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC;QACvE,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC,CAAC;SACxE;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"spellbound-soul.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/spellbound-soul.ts"],"names":[],"mappings":";;;AAKa,QAAA,cAAc,GAAoC;IAC9D,OAAO,EAAE,0BAAoE;IAC7E,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC;QACvE,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC;SAC5C;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC;SAC5C;IACF,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC;QACvE,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC,CAAC;SACxE;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC,CAAC;SAChF;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnDespawnInput, OnSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { OnDespawnedCard, OnSpawnedCard } from '../../card.interface';\r\n\r\nexport const SpellboundSoul: OnDespawnedCard & OnSpawnedCard = {\r\n\tcardIds: [CardIds.SpellboundSoul_BG34_110, CardIds.SpellboundSoul_BG34_110_G],\r\n\tonSpawned: (minion: BoardEntity, input: OnSpawnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.SpellboundSoul_BG34_110_G ? 2 : 1;\r\n\t\tconst totalSpellsCast = input.hero.globalInfo.TavernSpellsCastThisGame;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack += 2 * totalSpellsCast * mult;\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tminion.health += 1 * totalSpellsCast * mult;\r\n\t\t}\r\n\t},\r\n\tonDespawned: (minion: BoardEntity, input: OnDespawnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.SpellboundSoul_BG34_110_G ? 2 : 1;\r\n\t\tconst totalSpellsCast = input.hero.globalInfo.TavernSpellsCastThisGame;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack = Math.max(0, minion.attack - 2 * totalSpellsCast * mult);\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tconst minHealth = Math.min(minion.health, 1);\r\n\t\t\tminion.health = Math.max(minHealth, minion.health - 1 * totalSpellsCast * mult);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -5,6 +5,10 @@ exports.TimewarpedRecycler = {
|
|
|
5
5
|
cardIds: ["BG34_Giant_082", "BG34_Giant_082_G"],
|
|
6
6
|
baseAvengeValue: (cardId) => 4,
|
|
7
7
|
avenge: (minion, input) => {
|
|
8
|
+
var _a, _b;
|
|
9
|
+
const amount = minion.cardId === "BG34_Giant_082_G" ? 2 : 1;
|
|
10
|
+
const gi = (_a = input.hero.globalInfo) !== null && _a !== void 0 ? _a : (input.hero.globalInfo = {});
|
|
11
|
+
gi.maxGoldBonus = ((_b = gi.maxGoldBonus) !== null && _b !== void 0 ? _b : 0) + amount;
|
|
8
12
|
},
|
|
9
13
|
};
|
|
10
14
|
//# sourceMappingURL=timewarped-recycler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timewarped-recycler.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-recycler.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"timewarped-recycler.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-recycler.ts"],"names":[],"mappings":";;;AAYa,QAAA,kBAAkB,GAAe;IAC7C,OAAO,EAAE,sCAAwF;IACjG,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAmB,EAAE,KAAkB,EAAE,EAAE;;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,uBAAgD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,MAAM,EAAE,GAAG,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,mCAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QACjE,EAAE,CAAC,YAAY,GAAG,CAAC,MAAA,EAAE,CAAC,YAAY,mCAAI,CAAC,CAAC,GAAG,MAAM,CAAC;IACnD,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\n/**\r\n * Timewarped Recycler\r\n * BG34_Giant_082: Avenge (4): Increase your maximum Gold by (1).\r\n * BG34_Giant_082_G: Avenge (4): Increase your maximum Gold by (2).\r\n *\r\n * Combat cannot spend gold; the bonus is stored on globalInfo.maxGoldBonus for tavern writeback.\r\n */\r\nexport const TimewarpedRecycler: AvengeCard = {\r\n\tcardIds: [CardIds.TimewarpedRecycler_BG34_Giant_082, CardIds.TimewarpedRecycler_BG34_Giant_082_G],\r\n\tbaseAvengeValue: (cardId: string) => 4,\r\n\tavenge: (minion: BoardEntity, input: AvengeInput) => {\r\n\t\tconst amount = minion.cardId === CardIds.TimewarpedRecycler_BG34_Giant_082_G ? 2 : 1;\r\n\t\tconst gi = input.hero.globalInfo ?? (input.hero.globalInfo = {});\r\n\t\tgi.maxGoldBonus = (gi.maxGoldBonus ?? 0) + amount;\r\n\t},\r\n};\r\n"]}
|
|
@@ -7,7 +7,13 @@ exports.TimewarpedTraveler = {
|
|
|
7
7
|
baseAvengeValue: (cardId) => 4,
|
|
8
8
|
avenge: (minion, input) => {
|
|
9
9
|
const mult = minion.cardId === "BG34_Giant_605_G" ? 2 : 1;
|
|
10
|
-
const cardsToAdd =
|
|
10
|
+
const cardsToAdd = [];
|
|
11
|
+
for (let i = 0; i < mult; i++) {
|
|
12
|
+
const cardToAdd = input.gameState.cardsData.getRandomMinorTimewarpCard(1);
|
|
13
|
+
if (cardToAdd) {
|
|
14
|
+
cardsToAdd.push(cardToAdd);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
11
17
|
(0, cards_in_hand_1.addCardsInHand)(input.hero, input.board, cardsToAdd, input.gameState);
|
|
12
18
|
},
|
|
13
19
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timewarped-traveler.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-traveler.ts"],"names":[],"mappings":";;;AAGA,qEAAmE;
|
|
1
|
+
{"version":3,"file":"timewarped-traveler.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-traveler.ts"],"names":[],"mappings":";;;AAGA,qEAAmE;AAQtD,QAAA,kBAAkB,GAAe;IAC7C,OAAO,EAAE,sCAAwF;IACjG,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAmB,EAAE,KAAkB,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAAgD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;YAC1E,IAAI,SAAS,EAAE;gBACd,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aAC3B;SACD;QACD,IAAA,8BAAc,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\n/**\r\n * Timewarped Traveler\r\n * BG34_Giant_605: Avenge (4): Get a random 1-Cost card from the Minor Timewarp.\r\n * BG34_Giant_605_G: Avenge (4): Get two random 1-Cost cards from the Minor Timewarp.\r\n */\r\nexport const TimewarpedTraveler: AvengeCard = {\r\n\tcardIds: [CardIds.TimewarpedTraveler_BG34_Giant_605, CardIds.TimewarpedTraveler_BG34_Giant_605_G],\r\n\tbaseAvengeValue: (cardId: string) => 4,\r\n\tavenge: (minion: BoardEntity, input: AvengeInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedTraveler_BG34_Giant_605_G ? 2 : 1;\r\n\t\tconst cardsToAdd: string[] = [];\r\n\t\tfor (let i = 0; i < mult; i++) {\r\n\t\t\tconst cardToAdd = input.gameState.cardsData.getRandomMinorTimewarpCard(1);\r\n\t\t\tif (cardToAdd) {\r\n\t\t\t\tcardsToAdd.push(cardToAdd);\r\n\t\t\t}\r\n\t\t}\r\n\t\taddCardsInHand(input.hero, input.board, cardsToAdd, input.gameState);\r\n\t},\r\n};\r\n"]}
|
|
@@ -20,7 +20,7 @@ exports.SoulFermenter = {
|
|
|
20
20
|
},
|
|
21
21
|
onAfterFriendlyMinionDeath: (trinket, input) => {
|
|
22
22
|
var _a;
|
|
23
|
-
if (input.
|
|
23
|
+
if (input.boardBeforeProcs.length > 0 || ((_a = trinket.rememberedMinions) === null || _a === void 0 ? void 0 : _a.length) === 0) {
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
for (const minion of trinket.rememberedMinions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"soul-fermenter.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/soul-fermenter.ts"],"names":[],"mappings":";;;AAEA,iFAA8E;AAE9E,+EAA+F;AAE/F,0CAA4C;AAG/B,QAAA,aAAa,GAAuD;IAChF,OAAO,EAAE,sBAA0C;IACnD,mBAAmB,EAAE,iBAAiB;IACtC,aAAa,EAAE,CAAC,OAAqB,EAAE,KAAe,EAAE,EAAE;QACzD,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,MAAM,IAAI,GAAG,IAAA,kBAAU,EAAC,MAAM,CAAC,CAAC;YAChC,IAAA,yCAAmB,EAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAClF,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;SAC7B;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,0BAA0B,EAAE,CAAC,OAAqB,EAAE,KAAsC,EAAE,EAAE;;
|
|
1
|
+
{"version":3,"file":"soul-fermenter.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/soul-fermenter.ts"],"names":[],"mappings":";;;AAEA,iFAA8E;AAE9E,+EAA+F;AAE/F,0CAA4C;AAG/B,QAAA,aAAa,GAAuD;IAChF,OAAO,EAAE,sBAA0C;IACnD,mBAAmB,EAAE,iBAAiB;IACtC,aAAa,EAAE,CAAC,OAAqB,EAAE,KAAe,EAAE,EAAE;QACzD,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,MAAM,IAAI,GAAG,IAAA,kBAAU,EAAC,MAAM,CAAC,CAAC;YAChC,IAAA,yCAAmB,EAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAClF,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;SAC7B;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,0BAA0B,EAAE,CAAC,OAAqB,EAAE,KAAsC,EAAE,EAAE;;QAG7F,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAA,MAAA,OAAO,CAAC,iBAAiB,0CAAE,MAAM,MAAK,CAAC,EAAE;YACjF,OAAO;SACP;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,iBAAiB,EAAE;YAC/C,IAAA,0DAAqC,EACpC,MAAM,CAAC,MAAM,EACb,CAAC,EACD;gBACC,mBAAmB,EAAE,KAAK,CAAC,KAAK;gBAChC,uBAAuB,EAAE,KAAK,CAAC,IAAI;gBACnC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,cAAc,EAAE,KAAK,CAAC,SAAS;gBAC/B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,UAAU,EAAE,MAAM;aAClB,EACD,OAAO,EACP,CAAC,EACD,MAAM,CACN,CAAC;SACF;QAED,OAAO,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAChC,CAAC;CACD,CAAC","sourcesContent":["import { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { removeAurasFromSelf } from '../../../simulation/add-minion-to-board';\r\nimport { OnAfterFriendlyMinionDeathInput } from '../../../simulation/attack';\r\nimport { simplifiedSpawnEntitiesWithAddToBoard } from '../../../simulation/deathrattle-spawns';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { copyEntity } from '../../../utils';\r\nimport { OnAfterFriendlyMinionDeathCard, StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const SoulFermenter: StartOfCombatCard & OnAfterFriendlyMinionDeathCard = {\r\n\tcardIds: [CardIds.SoulFermenter_BG35_MagicItem_732],\r\n\tstartOfCombatTiming: 'start-of-combat',\r\n\tstartOfCombat: (trinket: BoardTrinket, input: SoCInput) => {\r\n\t\tconst targets = input.playerBoard.slice(0, 3);\r\n\t\ttrinket.rememberedMinions = [];\r\n\t\tfor (const target of targets) {\r\n\t\t\tconst copy = copyEntity(target);\r\n\t\t\tremoveAurasFromSelf(copy, input.playerBoard, input.playerEntity, input.gameState);\r\n\t\t\ttrinket.rememberedMinions.push(copy);\r\n\t\t\ttarget.definitelyDead = true;\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\tonAfterFriendlyMinionDeath: (trinket: BoardTrinket, input: OnAfterFriendlyMinionDeathInput) => {\r\n\t\t// If there are 2 soul fermenters, they both proc\r\n\t\t// https://replays.firestoneapp.com/?reviewId=ecdfab8d-e20e-4264-be4b-9cbe754118f7&turn=29&action=21\r\n\t\tif (input.boardBeforeProcs.length > 0 || trinket.rememberedMinions?.length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (const minion of trinket.rememberedMinions) {\r\n\t\t\tsimplifiedSpawnEntitiesWithAddToBoard(\r\n\t\t\t\tminion.cardId,\r\n\t\t\t\t1,\r\n\t\t\t\t{\r\n\t\t\t\t\tboardWithDeadEntity: input.board,\r\n\t\t\t\t\tboardWithDeadEntityHero: input.hero,\r\n\t\t\t\t\totherBoard: input.otherBoard,\r\n\t\t\t\t\totherBoardHero: input.otherHero,\r\n\t\t\t\t\tgameState: input.gameState,\r\n\t\t\t\t\tdeadEntity: minion,\r\n\t\t\t\t},\r\n\t\t\t\ttrinket,\r\n\t\t\t\t0,\r\n\t\t\t\tminion,\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\ttrinket.rememberedMinions = [];\r\n\t},\r\n};\r\n"]}
|
package/dist/input-sanitation.js
CHANGED
|
@@ -89,17 +89,20 @@ const buildFinalInputForPlayer = (playerInfo, isPlayer, anomalies, cards, cardsD
|
|
|
89
89
|
const sanitizeHeroPower = (hp, index, player, cards) => {
|
|
90
90
|
return hp;
|
|
91
91
|
};
|
|
92
|
+
const sanitizeEntity = (entity, isPlayer, cardsData, cards, applyDefaultScriptData) => {
|
|
93
|
+
const fixed = (0, enchantments_1.fixEnchantments)(entity, cards);
|
|
94
|
+
fixed.inInitialState = true;
|
|
95
|
+
if (applyDefaultScriptData) {
|
|
96
|
+
fixed.scriptDataNum1 = cardsData.defaultScriptDataNum(fixed.cardId) || fixed.scriptDataNum1;
|
|
97
|
+
}
|
|
98
|
+
(0, utils_1.addImpliedMechanics)(fixed, cardsData);
|
|
99
|
+
fixed.friendly = isPlayer;
|
|
100
|
+
return fixed;
|
|
101
|
+
};
|
|
92
102
|
const buildFinalInputBoard = (playerInfo, isPlayer, cardsData, cards) => {
|
|
93
103
|
var _a, _b;
|
|
94
|
-
const board = playerInfo.board
|
|
95
|
-
|
|
96
|
-
.map((entity) => ({
|
|
97
|
-
...entity,
|
|
98
|
-
inInitialState: true,
|
|
99
|
-
scriptDataNum1: cardsData.defaultScriptDataNum(entity.cardId) || entity.scriptDataNum1,
|
|
100
|
-
}))
|
|
101
|
-
.map((entity) => ({ ...(0, utils_1.addImpliedMechanics)(entity, cardsData), friendly: isPlayer }));
|
|
102
|
-
const hand = (_b = (_a = playerInfo.player.hand) === null || _a === void 0 ? void 0 : _a.map((entity) => ({ ...entity, inInitialState: true })).map((entity) => (0, enchantments_1.fixEnchantments)(entity, cards)).map((entity) => ({ ...(0, utils_1.addImpliedMechanics)(entity, cardsData), friendly: isPlayer }))) !== null && _b !== void 0 ? _b : [];
|
|
104
|
+
const board = playerInfo.board.map((entity) => sanitizeEntity(entity, isPlayer, cardsData, cards, true));
|
|
105
|
+
const hand = (_b = (_a = playerInfo.player.hand) === null || _a === void 0 ? void 0 : _a.map((entity) => sanitizeEntity(entity, isPlayer, cardsData, cards, false))) !== null && _b !== void 0 ? _b : [];
|
|
103
106
|
return { board, hand };
|
|
104
107
|
};
|
|
105
108
|
//# sourceMappingURL=input-sanitation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-sanitation.js","sourceRoot":"","sources":["../src/input-sanitation.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllCardsService } from '@firestone-hs/reference-data';\r\nimport { BgsBattleInfo } from './bgs-battle-info';\r\nimport { BgsBoardInfo } from './bgs-board-info';\r\nimport { BgsHeroPower, BgsPlayerEntity } from './bgs-player-entity';\r\nimport { BoardEntity } from './board-entity';\r\nimport { CardsData } from './cards/cards-data';\r\nimport { CardIds } from './services/card-ids';\r\nimport { setImplicitDataHero, setMissingAuras } from './simulation/auras';\r\nimport { fixEnchantments } from './simulation/enchantments';\r\nimport { addImpliedMechanics } from './utils';\r\n\r\nexport const buildFinalInput = (\r\n\tbattleInput: BgsBattleInfo,\r\n\tcards: AllCardsService,\r\n\tcardsData: CardsData,\r\n): BgsBattleInfo => {\r\n\tconst entityIdContainer = { entityId: 999_999_999 };\r\n\r\n\tconst {\r\n\t\tboard: playerBoard,\r\n\t\thand: playerHand,\r\n\t\tplayer: playerEntity,\r\n\t} = buildFinalInputForPlayer(\r\n\t\tbattleInput.playerBoard,\r\n\t\ttrue,\r\n\t\tbattleInput.gameState.anomalies,\r\n\t\tcards,\r\n\t\tcardsData,\r\n\t\tentityIdContainer,\r\n\t);\r\n\tconst {\r\n\t\tboard: playerTeammateBoard,\r\n\t\thand: playerTeammateHand,\r\n\t\tplayer: playerTeammateEntity,\r\n\t} = buildFinalInputForPlayer(\r\n\t\tbattleInput.playerTeammateBoard,\r\n\t\ttrue,\r\n\t\tbattleInput.gameState.anomalies,\r\n\t\tcards,\r\n\t\tcardsData,\r\n\t\tentityIdContainer,\r\n\t);\r\n\r\n\tconst {\r\n\t\tboard: opponentBoard,\r\n\t\thand: opponentHand,\r\n\t\tplayer: opponentEntity,\r\n\t} = buildFinalInputForPlayer(\r\n\t\tbattleInput.opponentBoard,\r\n\t\tfalse,\r\n\t\tbattleInput.gameState.anomalies,\r\n\t\tcards,\r\n\t\tcardsData,\r\n\t\tentityIdContainer,\r\n\t);\r\n\tconst {\r\n\t\tboard: opponentTeammateBoard,\r\n\t\thand: opponentTeammateHand,\r\n\t\tplayer: opponentTeammateEntity,\r\n\t} = buildFinalInputForPlayer(\r\n\t\tbattleInput.opponentTeammateBoard,\r\n\t\tfalse,\r\n\t\tbattleInput.gameState.anomalies,\r\n\t\tcards,\r\n\t\tcardsData,\r\n\t\tentityIdContainer,\r\n\t);\r\n\r\n\t// We do this so that we can have mutated objects inside the simulation and still\r\n\t// be able to start from a fresh copy for each simulation\r\n\tconst inputReady: BgsBattleInfo = {\r\n\t\tplayerBoard: {\r\n\t\t\tboard: playerBoard,\r\n\t\t\tplayer: {\r\n\t\t\t\t...playerEntity,\r\n\t\t\t\thand: playerHand,\r\n\t\t\t},\r\n\t\t},\r\n\t\tplayerTeammateBoard: !!playerTeammateEntity\r\n\t\t\t? {\r\n\t\t\t\t\tboard: playerTeammateBoard,\r\n\t\t\t\t\tplayer: {\r\n\t\t\t\t\t\t...playerTeammateEntity,\r\n\t\t\t\t\t\thand: playerTeammateHand,\r\n\t\t\t\t\t},\r\n\t\t\t }\r\n\t\t\t: null,\r\n\t\topponentBoard: {\r\n\t\t\tboard: opponentBoard,\r\n\t\t\tplayer: {\r\n\t\t\t\t...opponentEntity,\r\n\t\t\t\thand: opponentHand,\r\n\t\t\t},\r\n\t\t},\r\n\t\topponentTeammateBoard: !!opponentTeammateEntity\r\n\t\t\t? {\r\n\t\t\t\t\tboard: opponentTeammateBoard,\r\n\t\t\t\t\tplayer: {\r\n\t\t\t\t\t\t...opponentTeammateEntity,\r\n\t\t\t\t\t\thand: opponentTeammateHand,\r\n\t\t\t\t\t},\r\n\t\t\t }\r\n\t\t\t: null,\r\n\t\tgameState: {\r\n\t\t\t...battleInput.gameState,\r\n\t\t\tanomalies: battleInput.gameState.anomalies?.filter((a) => !!a) ?? ([] as readonly string[]),\r\n\t\t},\r\n\t\t// Combat-affecting options (e.g. applyDamageCap) must survive into runSingleBattle;\r\n\t\t// Monte Carlo knobs are still read from the original battleInput before cloning.\r\n\t\toptions: battleInput.options,\r\n\t\theroHasDied: battleInput.heroHasDied,\r\n\t\tdebugState: battleInput.debugState,\r\n\t} as BgsBattleInfo;\r\n\treturn inputReady;\r\n};\r\n\r\nconst buildFinalInputForPlayer = (\r\n\tplayerInfo: BgsBoardInfo,\r\n\tisPlayer: boolean,\r\n\tanomalies: readonly string[],\r\n\tcards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tentityIdContainer: { entityId: number },\r\n): { board: BoardEntity[]; hand: BoardEntity[]; player: BgsPlayerEntity } => {\r\n\tif (!playerInfo) {\r\n\t\treturn { board: [], hand: [], player: null };\r\n\t}\r\n\r\n\tconst { board, hand } = buildFinalInputBoard(playerInfo, isPlayer, cardsData, cards);\r\n\tconst isGhost = playerInfo.player?.hpLeft != null && playerInfo.player.hpLeft <= 0;\r\n\tplayerInfo.player.secrets = (playerInfo.player.secrets ?? playerInfo.secrets)?.filter((e) => !!e?.cardId) ?? [];\r\n\t// Add the scriptDataNum1 only on the start of combat phase, so that it doesn't trigger too soon\r\n\t// Don't do this, as secrets like Fleeting Vigor use this info to tell how much buff it will apply\r\n\t// playerInfo.player.secrets.forEach((secret) => (secret.scriptDataNum1 = 0));\r\n\t// Trinkets don't seem to trigger when facing the ghost\r\n\t// http://replays.firestoneapp.com/?reviewId=4ad32e03-2620-4fb1-8b43-cad55afd30fc&turn=27&action=2\r\n\t// One of the trinkets is Blood Golem Sticker, and no Blood Golem is summoned\r\n\t// Looks like that's not always the case:\r\n\t// http://replays.firestoneapp.com/?reviewId=9958e8d3-4388-4e6f-9b36-35f3a08be2f6&turn=25&action=4\r\n\t// playerInfo.player.trinkets = isGhost ? [] : playerInfo.player.trinkets?.filter((e) => !!e?.cardId) ?? [];\r\n\tconst fixedTrinkets = playerInfo.player.trinkets?.filter((e) => !!e?.cardId);\r\n\tplayerInfo.player.trinkets = (fixedTrinkets ?? []).sort((a, b) => a.entityId - b.entityId);\r\n\tplayerInfo.player.friendly = isPlayer;\r\n\tplayerInfo.player.globalInfo = playerInfo.player.globalInfo ?? {};\r\n\tplayerInfo.player.globalInfo.PirateAttackBonus = playerInfo.player.globalInfo.PirateAttackBonus ?? 0;\r\n\tplayerInfo.player.globalInfo.MechAttackBonus = playerInfo.player.globalInfo.MechAttackBonus ?? 0;\r\n\tplayerInfo.player.heroPowers = playerInfo.player.heroPowers?.length\r\n\t\t? playerInfo.player.heroPowers.map((hp, index) => sanitizeHeroPower(hp, index, playerInfo.player, cards))\r\n\t\t: [\r\n\t\t\t\t{\r\n\t\t\t\t\tcardId: playerInfo.player.heroPowerId,\r\n\t\t\t\t\tentityId: playerInfo.player.heroPowerEntityId,\r\n\t\t\t\t\tused: playerInfo.player.heroPowerUsed,\r\n\t\t\t\t\tinfo: playerInfo.player.heroPowerInfo,\r\n\t\t\t\t\tinfo2: playerInfo.player.heroPowerInfo2,\r\n\t\t\t\t} as BgsHeroPower,\r\n\t\t ];\r\n\t// playerInfo.player.heroPowerId =\r\n\t// \tplayerInfo.player.trinkets.find((t) => t.scriptDataNum6 === 3)?.cardId ??\r\n\t// \t(normalizeHeroCardId(playerInfo.player.cardId, cards) === CardIds.SireDenathrius_BG24_HERO_100\r\n\t// \t\t? playerInfo.player.questRewardEntities?.[0]?.cardId\r\n\t// \t\t: null) ??\r\n\t// \tplayerInfo.player.heroPowerId;\r\n\tplayerInfo.player.cardId = isGhost ? CardIds.Kelthuzad_TB_BaconShop_HERO_KelThuzad : playerInfo.player.cardId;\r\n\tplayerInfo.player.hpLeft = Math.max(1, playerInfo.player.hpLeft);\r\n\t// When using the simulator, the aura is not applied when receiving the board state.\r\n\tsetMissingAuras(board, playerInfo.player, anomalies, cards);\r\n\t// Avenge, maxHealth, etc.\r\n\t// setImplicitData(playerBoard, cardsData);\r\n\t// setImplicitData(opponentBoard, cardsData);\r\n\t// Avenge, globalInfo\r\n\tsetImplicitDataHero(playerInfo.player, cardsData, isPlayer, entityIdContainer);\r\n\treturn { board, hand, player: playerInfo.player };\r\n};\r\n\r\nconst sanitizeHeroPower = (\r\n\thp: BgsHeroPower,\r\n\tindex: number,\r\n\tplayer: BgsPlayerEntity,\r\n\tcards: AllCardsService,\r\n): BgsHeroPower => {\r\n\treturn hp;\r\n\t// FIXME: fix this when the situation presents itself. At the moment, we already have trinkets / hero powers / quest rewards\r\n\t// handled separately, so maybe there is no need to map a quest reward to one of Sire D.'s hero power\r\n\t// if (index !== 0) {\r\n\t// \treturn hp;\r\n\t// }\r\n\r\n\t// hp.cardId =\r\n\t// \tplayer.trinkets.find((t) => t.scriptDataNum6 === 3)?.cardId ??\r\n\t// \t(normalizeHeroCardId(player.cardId, cards) === CardIds.SireDenathrius_BG24_HERO_100\r\n\t// \t\t? player.questRewardEntities?.[0]?.cardId\r\n\t// \t\t: null) ??\r\n\t// \thp.cardId;\r\n\t// return hp;\r\n};\r\n\r\nconst buildFinalInputBoard = (\r\n\tplayerInfo: BgsBoardInfo,\r\n\tisPlayer: boolean,\r\n\tcardsData: CardsData,\r\n\tcards: AllCardsService,\r\n): { board: BoardEntity[]; hand: BoardEntity[] } => {\r\n\tconst board = playerInfo.board\r\n\t\t.map((entity) => fixEnchantments(entity, cards))\r\n\t\t.map((entity) => ({\r\n\t\t\t...entity,\r\n\t\t\tinInitialState: true,\r\n\t\t\tscriptDataNum1: cardsData.defaultScriptDataNum(entity.cardId) || entity.scriptDataNum1,\r\n\t\t}))\r\n\t\t.map((entity) => ({ ...addImpliedMechanics(entity, cardsData), friendly: isPlayer } as BoardEntity));\r\n\tconst hand =\r\n\t\tplayerInfo.player.hand\r\n\t\t\t?.map((entity) => ({ ...entity, inInitialState: true }))\r\n\t\t\t.map((entity) => fixEnchantments(entity, cards))\r\n\t\t\t.map((entity) => ({ ...addImpliedMechanics(entity, cardsData), friendly: isPlayer } as BoardEntity)) ?? [];\r\n\r\n\treturn { board, hand };\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"input-sanitation.js","sourceRoot":"","sources":["../src/input-sanitation.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllCardsService } from '@firestone-hs/reference-data';\r\nimport { BgsBattleInfo } from './bgs-battle-info';\r\nimport { BgsBoardInfo } from './bgs-board-info';\r\nimport { BgsHeroPower, BgsPlayerEntity } from './bgs-player-entity';\r\nimport { BoardEntity } from './board-entity';\r\nimport { CardsData } from './cards/cards-data';\r\nimport { CardIds } from './services/card-ids';\r\nimport { setImplicitDataHero, setMissingAuras } from './simulation/auras';\r\nimport { fixEnchantments } from './simulation/enchantments';\r\nimport { addImpliedMechanics } from './utils';\r\n\r\nexport const buildFinalInput = (\r\n\tbattleInput: BgsBattleInfo,\r\n\tcards: AllCardsService,\r\n\tcardsData: CardsData,\r\n): BgsBattleInfo => {\r\n\tconst entityIdContainer = { entityId: 999_999_999 };\r\n\r\n\tconst {\r\n\t\tboard: playerBoard,\r\n\t\thand: playerHand,\r\n\t\tplayer: playerEntity,\r\n\t} = buildFinalInputForPlayer(\r\n\t\tbattleInput.playerBoard,\r\n\t\ttrue,\r\n\t\tbattleInput.gameState.anomalies,\r\n\t\tcards,\r\n\t\tcardsData,\r\n\t\tentityIdContainer,\r\n\t);\r\n\tconst {\r\n\t\tboard: playerTeammateBoard,\r\n\t\thand: playerTeammateHand,\r\n\t\tplayer: playerTeammateEntity,\r\n\t} = buildFinalInputForPlayer(\r\n\t\tbattleInput.playerTeammateBoard,\r\n\t\ttrue,\r\n\t\tbattleInput.gameState.anomalies,\r\n\t\tcards,\r\n\t\tcardsData,\r\n\t\tentityIdContainer,\r\n\t);\r\n\r\n\tconst {\r\n\t\tboard: opponentBoard,\r\n\t\thand: opponentHand,\r\n\t\tplayer: opponentEntity,\r\n\t} = buildFinalInputForPlayer(\r\n\t\tbattleInput.opponentBoard,\r\n\t\tfalse,\r\n\t\tbattleInput.gameState.anomalies,\r\n\t\tcards,\r\n\t\tcardsData,\r\n\t\tentityIdContainer,\r\n\t);\r\n\tconst {\r\n\t\tboard: opponentTeammateBoard,\r\n\t\thand: opponentTeammateHand,\r\n\t\tplayer: opponentTeammateEntity,\r\n\t} = buildFinalInputForPlayer(\r\n\t\tbattleInput.opponentTeammateBoard,\r\n\t\tfalse,\r\n\t\tbattleInput.gameState.anomalies,\r\n\t\tcards,\r\n\t\tcardsData,\r\n\t\tentityIdContainer,\r\n\t);\r\n\r\n\t// We do this so that we can have mutated objects inside the simulation and still\r\n\t// be able to start from a fresh copy for each simulation\r\n\tconst inputReady: BgsBattleInfo = {\r\n\t\tplayerBoard: {\r\n\t\t\tboard: playerBoard,\r\n\t\t\tplayer: {\r\n\t\t\t\t...playerEntity,\r\n\t\t\t\thand: playerHand,\r\n\t\t\t},\r\n\t\t},\r\n\t\tplayerTeammateBoard: !!playerTeammateEntity\r\n\t\t\t? {\r\n\t\t\t\t\tboard: playerTeammateBoard,\r\n\t\t\t\t\tplayer: {\r\n\t\t\t\t\t\t...playerTeammateEntity,\r\n\t\t\t\t\t\thand: playerTeammateHand,\r\n\t\t\t\t\t},\r\n\t\t\t }\r\n\t\t\t: null,\r\n\t\topponentBoard: {\r\n\t\t\tboard: opponentBoard,\r\n\t\t\tplayer: {\r\n\t\t\t\t...opponentEntity,\r\n\t\t\t\thand: opponentHand,\r\n\t\t\t},\r\n\t\t},\r\n\t\topponentTeammateBoard: !!opponentTeammateEntity\r\n\t\t\t? {\r\n\t\t\t\t\tboard: opponentTeammateBoard,\r\n\t\t\t\t\tplayer: {\r\n\t\t\t\t\t\t...opponentTeammateEntity,\r\n\t\t\t\t\t\thand: opponentTeammateHand,\r\n\t\t\t\t\t},\r\n\t\t\t }\r\n\t\t\t: null,\r\n\t\tgameState: {\r\n\t\t\t...battleInput.gameState,\r\n\t\t\tanomalies: battleInput.gameState.anomalies?.filter((a) => !!a) ?? ([] as readonly string[]),\r\n\t\t},\r\n\t\t// Combat-affecting options (e.g. applyDamageCap) must survive into runSingleBattle;\r\n\t\t// Monte Carlo knobs are still read from the original battleInput before cloning.\r\n\t\toptions: battleInput.options,\r\n\t\theroHasDied: battleInput.heroHasDied,\r\n\t\tdebugState: battleInput.debugState,\r\n\t} as BgsBattleInfo;\r\n\treturn inputReady;\r\n};\r\n\r\nconst buildFinalInputForPlayer = (\r\n\tplayerInfo: BgsBoardInfo,\r\n\tisPlayer: boolean,\r\n\tanomalies: readonly string[],\r\n\tcards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tentityIdContainer: { entityId: number },\r\n): { board: BoardEntity[]; hand: BoardEntity[]; player: BgsPlayerEntity } => {\r\n\tif (!playerInfo) {\r\n\t\treturn { board: [], hand: [], player: null };\r\n\t}\r\n\r\n\tconst { board, hand } = buildFinalInputBoard(playerInfo, isPlayer, cardsData, cards);\r\n\tconst isGhost = playerInfo.player?.hpLeft != null && playerInfo.player.hpLeft <= 0;\r\n\tplayerInfo.player.secrets = (playerInfo.player.secrets ?? playerInfo.secrets)?.filter((e) => !!e?.cardId) ?? [];\r\n\t// Add the scriptDataNum1 only on the start of combat phase, so that it doesn't trigger too soon\r\n\t// Don't do this, as secrets like Fleeting Vigor use this info to tell how much buff it will apply\r\n\t// playerInfo.player.secrets.forEach((secret) => (secret.scriptDataNum1 = 0));\r\n\t// Trinkets don't seem to trigger when facing the ghost\r\n\t// http://replays.firestoneapp.com/?reviewId=4ad32e03-2620-4fb1-8b43-cad55afd30fc&turn=27&action=2\r\n\t// One of the trinkets is Blood Golem Sticker, and no Blood Golem is summoned\r\n\t// Looks like that's not always the case:\r\n\t// http://replays.firestoneapp.com/?reviewId=9958e8d3-4388-4e6f-9b36-35f3a08be2f6&turn=25&action=4\r\n\t// playerInfo.player.trinkets = isGhost ? [] : playerInfo.player.trinkets?.filter((e) => !!e?.cardId) ?? [];\r\n\tconst fixedTrinkets = playerInfo.player.trinkets?.filter((e) => !!e?.cardId);\r\n\tplayerInfo.player.trinkets = (fixedTrinkets ?? []).sort((a, b) => a.entityId - b.entityId);\r\n\tplayerInfo.player.friendly = isPlayer;\r\n\tplayerInfo.player.globalInfo = playerInfo.player.globalInfo ?? {};\r\n\tplayerInfo.player.globalInfo.PirateAttackBonus = playerInfo.player.globalInfo.PirateAttackBonus ?? 0;\r\n\tplayerInfo.player.globalInfo.MechAttackBonus = playerInfo.player.globalInfo.MechAttackBonus ?? 0;\r\n\tplayerInfo.player.heroPowers = playerInfo.player.heroPowers?.length\r\n\t\t? playerInfo.player.heroPowers.map((hp, index) => sanitizeHeroPower(hp, index, playerInfo.player, cards))\r\n\t\t: [\r\n\t\t\t\t{\r\n\t\t\t\t\tcardId: playerInfo.player.heroPowerId,\r\n\t\t\t\t\tentityId: playerInfo.player.heroPowerEntityId,\r\n\t\t\t\t\tused: playerInfo.player.heroPowerUsed,\r\n\t\t\t\t\tinfo: playerInfo.player.heroPowerInfo,\r\n\t\t\t\t\tinfo2: playerInfo.player.heroPowerInfo2,\r\n\t\t\t\t} as BgsHeroPower,\r\n\t\t ];\r\n\t// playerInfo.player.heroPowerId =\r\n\t// \tplayerInfo.player.trinkets.find((t) => t.scriptDataNum6 === 3)?.cardId ??\r\n\t// \t(normalizeHeroCardId(playerInfo.player.cardId, cards) === CardIds.SireDenathrius_BG24_HERO_100\r\n\t// \t\t? playerInfo.player.questRewardEntities?.[0]?.cardId\r\n\t// \t\t: null) ??\r\n\t// \tplayerInfo.player.heroPowerId;\r\n\tplayerInfo.player.cardId = isGhost ? CardIds.Kelthuzad_TB_BaconShop_HERO_KelThuzad : playerInfo.player.cardId;\r\n\tplayerInfo.player.hpLeft = Math.max(1, playerInfo.player.hpLeft);\r\n\t// When using the simulator, the aura is not applied when receiving the board state.\r\n\tsetMissingAuras(board, playerInfo.player, anomalies, cards);\r\n\t// Avenge, maxHealth, etc.\r\n\t// setImplicitData(playerBoard, cardsData);\r\n\t// setImplicitData(opponentBoard, cardsData);\r\n\t// Avenge, globalInfo\r\n\tsetImplicitDataHero(playerInfo.player, cardsData, isPlayer, entityIdContainer);\r\n\treturn { board, hand, player: playerInfo.player };\r\n};\r\n\r\nconst sanitizeHeroPower = (\r\n\thp: BgsHeroPower,\r\n\tindex: number,\r\n\tplayer: BgsPlayerEntity,\r\n\tcards: AllCardsService,\r\n): BgsHeroPower => {\r\n\treturn hp;\r\n\t// FIXME: fix this when the situation presents itself. At the moment, we already have trinkets / hero powers / quest rewards\r\n\t// handled separately, so maybe there is no need to map a quest reward to one of Sire D.'s hero power\r\n\t// if (index !== 0) {\r\n\t// \treturn hp;\r\n\t// }\r\n\r\n\t// hp.cardId =\r\n\t// \tplayer.trinkets.find((t) => t.scriptDataNum6 === 3)?.cardId ??\r\n\t// \t(normalizeHeroCardId(player.cardId, cards) === CardIds.SireDenathrius_BG24_HERO_100\r\n\t// \t\t? player.questRewardEntities?.[0]?.cardId\r\n\t// \t\t: null) ??\r\n\t// \thp.cardId;\r\n\t// return hp;\r\n};\r\n\r\nconst sanitizeEntity = (\r\n\tentity: BoardEntity,\r\n\tisPlayer: boolean,\r\n\tcardsData: CardsData,\r\n\tcards: AllCardsService,\r\n\tapplyDefaultScriptData: boolean,\r\n): BoardEntity => {\r\n\tconst fixed = fixEnchantments(entity, cards);\r\n\tfixed.inInitialState = true;\r\n\tif (applyDefaultScriptData) {\r\n\t\tfixed.scriptDataNum1 = cardsData.defaultScriptDataNum(fixed.cardId) || fixed.scriptDataNum1;\r\n\t}\r\n\taddImpliedMechanics(fixed, cardsData);\r\n\tfixed.friendly = isPlayer;\r\n\treturn fixed;\r\n};\r\n\r\nconst buildFinalInputBoard = (\r\n\tplayerInfo: BgsBoardInfo,\r\n\tisPlayer: boolean,\r\n\tcardsData: CardsData,\r\n\tcards: AllCardsService,\r\n): { board: BoardEntity[]; hand: BoardEntity[] } => {\r\n\tconst board = playerInfo.board.map((entity) => sanitizeEntity(entity, isPlayer, cardsData, cards, true));\r\n\tconst hand =\r\n\t\tplayerInfo.player.hand?.map((entity) => sanitizeEntity(entity, isPlayer, cardsData, cards, false)) ?? [];\r\n\treturn { board, hand };\r\n};\r\n"]}
|
package/dist/mechanics/rally.js
CHANGED
|
@@ -9,22 +9,25 @@ const utils_1 = require("../utils");
|
|
|
9
9
|
const DOUBLE_RALLY_CARD_IDS = ["BG34_Giant_376"];
|
|
10
10
|
const TRIPLE_RALLY_CARD_IDS = ["BG34_Giant_376_G"];
|
|
11
11
|
const triggerRally = (attackingBoard, attackingBoardHero, attacker, defendingBoard, defendingBoardHero, defendingEntity, gameState) => {
|
|
12
|
-
var _a, _b, _c, _d;
|
|
12
|
+
var _a, _b, _c, _d, _e, _f;
|
|
13
13
|
let damageDoneByAttacker = 0;
|
|
14
14
|
let damageDoneByDefender = 0;
|
|
15
15
|
const isAttackerRallying = (0, utils_1.hasEntityMechanic)(attacker, reference_data_1.GameTag.BACON_RALLY, gameState.allCards);
|
|
16
16
|
let rallyLoops = 1;
|
|
17
17
|
if (isAttackerRallying) {
|
|
18
|
+
attackingBoardHero.globalInfo = (_a = attackingBoardHero.globalInfo) !== null && _a !== void 0 ? _a : {};
|
|
19
|
+
attackingBoardHero.globalInfo.RallyMinionAttacksThisCombat =
|
|
20
|
+
((_b = attackingBoardHero.globalInfo.RallyMinionAttacksThisCombat) !== null && _b !== void 0 ? _b : 0) + 1;
|
|
18
21
|
const cardIds = [
|
|
19
22
|
...attackingBoard.map((e) => e.cardId),
|
|
20
|
-
...((
|
|
23
|
+
...((_d = (_c = attackingBoardHero.secrets) === null || _c === void 0 ? void 0 : _c.map((e) => e.cardId)) !== null && _d !== void 0 ? _d : []),
|
|
21
24
|
];
|
|
22
25
|
const triggerMult = cardIds.some((cardId) => TRIPLE_RALLY_CARD_IDS.includes(cardId))
|
|
23
26
|
? 3
|
|
24
27
|
: cardIds.some((cardId) => DOUBLE_RALLY_CARD_IDS.includes(cardId))
|
|
25
28
|
? 2
|
|
26
29
|
: 1;
|
|
27
|
-
const numberOfRallyingCries = (
|
|
30
|
+
const numberOfRallyingCries = (_f = (_e = attackingBoardHero.questRewardEntities) === null || _e === void 0 ? void 0 : _e.filter((r) => r.cardId === "BG33_Reward_021").length) !== null && _f !== void 0 ? _f : 0;
|
|
28
31
|
rallyLoops = triggerMult + numberOfRallyingCries;
|
|
29
32
|
}
|
|
30
33
|
for (let i = 0; i < rallyLoops; i++) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rally.js","sourceRoot":"","sources":["../../src/mechanics/rally.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rally.js","sourceRoot":"","sources":["../../src/mechanics/rally.ts"],"names":[],"mappings":"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","sourcesContent":["import { GameTag } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasRally } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { fixEnchantments } from '../simulation/enchantments';\r\nimport { FullGameState } from '../simulation/internal-game-state';\r\nimport { hasEntityMechanic } from '../utils';\r\n\r\nconst DOUBLE_RALLY_CARD_IDS: string[] = [CardIds.TimewarpedDeios_BG34_Giant_376];\r\nconst TRIPLE_RALLY_CARD_IDS: string[] = [CardIds.TimewarpedDeios_BG34_Giant_376_G];\r\n\r\nexport const triggerRally = (\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tattacker: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tgameState: FullGameState,\r\n): { dmgDoneByAttacker: number; dmgDoneByDefender: number } => {\r\n\tlet damageDoneByAttacker = 0;\r\n\tlet damageDoneByDefender = 0;\r\n\tconst isAttackerRallying = hasEntityMechanic(attacker, GameTag.BACON_RALLY, gameState.allCards);\r\n\r\n\t// Only compute the multiplier when the attacker actually rallies, as this is a hot path\r\n\tlet rallyLoops = 1;\r\n\tif (isAttackerRallying) {\r\n\t\tattackingBoardHero.globalInfo = attackingBoardHero.globalInfo ?? {};\r\n\t\tattackingBoardHero.globalInfo.RallyMinionAttacksThisCombat =\r\n\t\t\t(attackingBoardHero.globalInfo.RallyMinionAttacksThisCombat ?? 0) + 1;\r\n\t\tconst cardIds = [\r\n\t\t\t...attackingBoard.map((e) => e.cardId),\r\n\t\t\t...(attackingBoardHero.secrets?.map((e) => e.cardId) ?? []),\r\n\t\t];\r\n\t\tconst triggerMult = cardIds.some((cardId) => TRIPLE_RALLY_CARD_IDS.includes(cardId))\r\n\t\t\t? 3\r\n\t\t\t: cardIds.some((cardId) => DOUBLE_RALLY_CARD_IDS.includes(cardId))\r\n\t\t\t? 2\r\n\t\t\t: 1;\r\n\t\tconst numberOfRallyingCries =\r\n\t\t\tattackingBoardHero.questRewardEntities?.filter((r) => r.cardId === CardIds.RallyingCry_BG33_Reward_021)\r\n\t\t\t\t.length ?? 0;\r\n\t\trallyLoops = triggerMult + numberOfRallyingCries;\r\n\t}\r\n\r\n\tfor (let i = 0; i < rallyLoops; i++) {\r\n\t\tconst onAttackImpl = cardMappings[attacker.cardId];\r\n\t\tif (hasRally(onAttackImpl)) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.rally(attacker, {\r\n\t\t\t\tattacker: attacker,\r\n\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tgameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t\tconst enchantments = attacker.enchantments;\r\n\t\tfor (const enchantment of enchantments) {\r\n\t\t\tconst onAttackImpl = cardMappings[enchantment.cardId];\r\n\t\t\tif (hasRally(onAttackImpl)) {\r\n\t\t\t\tlet enchantmentToMinion: BoardEntity = {\r\n\t\t\t\t\t...enchantment,\r\n\t\t\t\t\tentityId: attacker.entityId,\r\n\t\t\t\t\tattack: attacker.attack,\r\n\t\t\t\t\thealth: attacker.health,\r\n\t\t\t\t\tmaxHealth: attacker.maxHealth,\r\n\t\t\t\t\tmaxAttack: attacker.maxAttack,\r\n\t\t\t\t\tabiityChargesLeft: attacker.abiityChargesLeft,\r\n\t\t\t\t};\r\n\t\t\t\tenchantmentToMinion = fixEnchantments(enchantmentToMinion, gameState.allCards);\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.rally(enchantmentToMinion, {\r\n\t\t\t\t\tattacker: attacker,\r\n\t\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t\t});\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn { dmgDoneByAttacker: damageDoneByAttacker, dmgDoneByDefender: damageDoneByDefender };\r\n};\r\n"]}
|
|
@@ -7,6 +7,14 @@ import { SingleSimulationResult } from './single-simulation-result';
|
|
|
7
7
|
export { isValidDeathrattleEnchantment } from './simulation/deathrattle-utils';
|
|
8
8
|
export { createSeededRng, defaultRng, getActiveRng, random, withRng } from './services/rng';
|
|
9
9
|
export type { Rng } from './services/rng';
|
|
10
|
+
export { triggerRally } from './mechanics/rally';
|
|
11
|
+
export { hasRally } from './cards/card.interface';
|
|
12
|
+
export type { RallyCard } from './cards/card.interface';
|
|
13
|
+
export type { OnAttackInput } from './simulation/on-attack';
|
|
14
|
+
export { triggerBattlecry } from './simulation/battlecries';
|
|
15
|
+
export { doFullAttack } from './simulation/attack';
|
|
16
|
+
export { applyOnAttackEffects } from './simulation/on-attack';
|
|
17
|
+
export declare const ensureCardsLoaded: (cards?: AllCardsService) => Promise<boolean>;
|
|
10
18
|
export declare const assignCards: (cards: AllCardsService) => void;
|
|
11
19
|
export interface SimulateSingleCombatOptions {
|
|
12
20
|
readonly seed?: number;
|