From 7f8b3b903c9f9290d060def796e27c3d18085e8d Mon Sep 17 00:00:00 2001 From: Piedpiper <43519401+piedpiper358@users.noreply.github.com> Date: Wed, 9 Nov 2022 18:14:14 +0300 Subject: [PATCH] Change event to TURN_START and update merc role and ability speed according to tags --- .../mercenaries/mercenaries-battle-state.ts | 23 ++++++- core/src/js/services/game-events.service.ts | 4 ++ .../parser/mercenaries-speed-parser.ts | 1 + .../parser/mercenaries-turn-start-parser.ts | 63 ++++++++++++++++++- 4 files changed, 87 insertions(+), 4 deletions(-) diff --git a/core/src/js/models/mercenaries/mercenaries-battle-state.ts b/core/src/js/models/mercenaries/mercenaries-battle-state.ts index d429a64e70..de1ba2df50 100644 --- a/core/src/js/models/mercenaries/mercenaries-battle-state.ts +++ b/core/src/js/models/mercenaries/mercenaries-battle-state.ts @@ -10,7 +10,7 @@ export class MercenariesBattleState { readonly playerTeam: MercenariesBattleTeam = new MercenariesBattleTeam(); readonly opponentTeam: MercenariesBattleTeam = new MercenariesBattleTeam(); - readonly actionQueue: readonly MercenariesAction[] = []; + readonly actionQueue: MercenariesAction[] = []; // A cache that is populated on game start readonly mercenariesFromMemory: MemoryMercenariesInfo; @@ -55,6 +55,27 @@ export class MercenariesBattleTeam { ); return this.update({ mercenaries: newMercenaries }); } + + public updateAbility( + entityId: number, + base: Partial>, + ): MercenariesBattleTeam { + const newMercenaries: readonly BattleMercenary[] = + (this.mercenaries ?? []).map((merc) => ( + merc.update( + BattleMercenary.create( + { + abilities: (merc.abilities ?? []).map((ability) => ( + ability.entityId === entityId + ? ability.update(BattleAbility.create(base)) + : ability + )) + } + ) + ) + )) + return this.update({ mercenaries: newMercenaries }); + } } export class BattleMercenary { diff --git a/core/src/js/services/game-events.service.ts b/core/src/js/services/game-events.service.ts index 6d5b8dcb17..849bbf1caf 100644 --- a/core/src/js/services/game-events.service.ts +++ b/core/src/js/services/game-events.service.ts @@ -922,6 +922,10 @@ export class GameEvents { // Legacy, to avoid regenerating all the tests turnNumber: gameEvent.Value.Turn || gameEvent.Value, timestamp: gameEvent.Value.Timestamp, + playerBoard: gameEvent.Value?.GameState?.Player?.Board, + playerLettuceAbilities: gameEvent.Value?.GameState?.Player?.LettuceAbilities, + opponentBoard: gameEvent.Value?.GameState?.Opponent?.Board, + opponentLettuceAbilities: gameEvent.Value?.GameState?.Opponent?.LettuceAbilities, }, } as GameEvent), ); diff --git a/core/src/js/services/mercenaries/parser/mercenaries-speed-parser.ts b/core/src/js/services/mercenaries/parser/mercenaries-speed-parser.ts index 3d8a1fe000..778350811c 100644 --- a/core/src/js/services/mercenaries/parser/mercenaries-speed-parser.ts +++ b/core/src/js/services/mercenaries/parser/mercenaries-speed-parser.ts @@ -34,6 +34,7 @@ export class MercenariesSpeedParser implements MercenariesParser { entityId, cardId, BattleAbility.create({ + cardId: cardId, speed: event.additionalData.cost, }), ); diff --git a/core/src/js/services/mercenaries/parser/mercenaries-turn-start-parser.ts b/core/src/js/services/mercenaries/parser/mercenaries-turn-start-parser.ts index 29dea30ec7..88a1b63206 100644 --- a/core/src/js/services/mercenaries/parser/mercenaries-turn-start-parser.ts +++ b/core/src/js/services/mercenaries/parser/mercenaries-turn-start-parser.ts @@ -1,16 +1,73 @@ import { GameEvent } from '../../../models/game-event'; -import { MercenariesBattleState } from '../../../models/mercenaries/mercenaries-battle-state'; +import { MercenariesBattleState, MercenariesBattleTeam } from '../../../models/mercenaries/mercenaries-battle-state'; +import { getHeroRole } from '../mercenaries-utils'; import { MercenariesParser } from './_mercenaries-parser'; +import { GameTag, TagRole } from '@firestone-hs/reference-data'; export class MercenariesTurnStartParser implements MercenariesParser { public eventType = () => GameEvent.TURN_START; public applies = (battleState: MercenariesBattleState) => !!battleState; - public async parse(battleState: MercenariesBattleState, event: GameEvent): Promise { + public async parse( + battleState: MercenariesBattleState, + event: GameEvent, + ): Promise { + + if(event.additionalData?.playerBoard && event.additionalData?.playerLettuceAbilities){ + var newPlayerTeam: MercenariesBattleTeam = battleState.playerTeam; + + for (var merc of event.additionalData?.playerBoard) { + newPlayerTeam = newPlayerTeam.updateMercenary(merc.entityId, + { + cardId: merc.cardId, + role: getHeroRole(TagRole[merc?.tags?.find((tag) => tag.Name==GameTag.LETTUCE_ROLE)?.Value]), + }); + } + + for (var ability of event.additionalData?.playerLettuceAbilities) { + newPlayerTeam = newPlayerTeam.updateAbility(ability.entityId, + { + cardId: ability.cardId, + speed: ability.tags?.find((tag) => tag.Name==GameTag.COST)?.Value, + cooldownLeft: ability.tags?.find((tag) => tag.Name==GameTag.LETTUCE_CURRENT_COOLDOWN)?.Value, + } + ) + } + } + else { + console.warn('[merc-game-state-update] player info not provided', event); + } + + if(event.additionalData?.opponentBoard && event.additionalData?.opponentLettuceAbilities){ + var newOpponentTeam: MercenariesBattleTeam = battleState.opponentTeam; + + for (var merc of event.additionalData?.opponentBoard) { + newOpponentTeam = newOpponentTeam.updateMercenary(merc.entityId, + { + cardId: merc.cardId, + role: getHeroRole(TagRole[merc?.tags?.find((tag) => tag.Name==GameTag.LETTUCE_ROLE)?.Value]), + }); + } + for (var ability of event.additionalData?.opponentLettuceAbilities) { + newOpponentTeam = newOpponentTeam.updateAbility(ability.entityId, + { + cardId: ability.cardId, + speed: ability.tags?.find((tag) => tag.Name==GameTag.COST)?.Value, + cooldownLeft: ability.tags?.find((tag) => tag.Name==GameTag.LETTUCE_CURRENT_COOLDOWN)?.Value, + } + ) + } + } + else { + console.warn('[merc-game-state-update] opponent info not provided', event); + } + return battleState.update({ + playerTeam: newPlayerTeam, + opponentTeam: newOpponentTeam, currentTurn: event.additionalData.turnNumber, actionQueue: [], - }); + } as MercenariesBattleState); } }