From 4bc5341395691217904ddb32b885b0e28235d32c Mon Sep 17 00:00:00 2001 From: Fan2Shrek Date: Sat, 22 Aug 2026 11:27:26 +0200 Subject: [PATCH 1/2] [API] Add dead cat card --- api/analyzer-baseline.toml | 22 ++++- api/resources/cards_list.php | 1 + api/src/Game/Card/Passive/DeadCatCard.php | 71 ++++++++++++++ api/templates/dev/passive.tpl.php | 15 +++ .../Game/Card/Passive/DeadCatCardTest.php | 93 +++++++++++++++++++ api/translations/game.fr.php | 4 + 6 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 api/src/Game/Card/Passive/DeadCatCard.php create mode 100644 api/templates/dev/passive.tpl.php create mode 100644 api/tests/Unit/Game/Card/Passive/DeadCatCardTest.php diff --git a/api/analyzer-baseline.toml b/api/analyzer-baseline.toml index 56a58212..baf87625 100644 --- a/api/analyzer-baseline.toml +++ b/api/analyzer-baseline.toml @@ -288,6 +288,24 @@ code = "incompatible-parameter-name" message = 'Parameter #1 of `App\Game\Card\Monster\SirenCard::onturnaction()` is named `$context` but parent `App\Game\Card\Trait\BaseOnTurnTrait::onturnaction()` names it `$gameContext`' count = 1 +[[issues]] +file = "src/Game/Card/Passive/DeadCatCard.php" +code = "mixed-property-type-coercion" +message = "A value with a less specific type `nonnull` is being assigned to property `$$counter` (int)." +count = 1 + +[[issues]] +file = "src/Game/Card/Passive/DeadCatCard.php" +code = "possibly-null-argument" +message = 'Argument #1 of method `App\Game\GameContext::discardcard` is possibly `null`, but parameter type `string` does not accept it.' +count = 1 + +[[issues]] +file = "src/Game/Card/Passive/DeadCatCard.php" +code = "possibly-null-argument" +message = 'Argument #1 of method `App\Game\GameContext::getplayerstatebyid` is possibly `null`, but parameter type `string` does not accept it.' +count = 1 + [[issues]] file = "src/Game/Card/Passive/ImStillStandingCard.php" code = "possibly-null-argument" @@ -321,13 +339,13 @@ count = 1 [[issues]] file = "src/Game/Card/Trait/BaseOnTurnTrait.php" code = "non-existent-method" -message = 'Method `guardedaction` does not exist on type `App\Game\Card\Trait\BaseOnTurnTrait`.' +message = 'Method `getinstanceid` does not exist on type `App\Game\Card\Trait\BaseOnTurnTrait`.' count = 1 [[issues]] file = "src/Game/Card/Trait/BaseOnTurnTrait.php" code = "non-existent-method" -message = 'Method `getinstanceid` does not exist on type `App\Game\Card\Trait\BaseOnTurnTrait`.' +message = 'Method `guardedaction` does not exist on type `App\Game\Card\Trait\BaseOnTurnTrait`.' count = 1 [[issues]] diff --git a/api/resources/cards_list.php b/api/resources/cards_list.php index cedbb0d4..c94f4eda 100644 --- a/api/resources/cards_list.php +++ b/api/resources/cards_list.php @@ -65,6 +65,7 @@ 'BananaFarm' => Card\Passive\BananaFarmCard::class, 'BloodSucker' => Card\Passive\BloodSuckerCard::class, 'consolation_prices' => Card\Passive\ConsolationPricesCard::class, + 'DeadCat' => Card\Passive\DeadCatCard::class, 'HackedZone' => Card\Passive\HackedZoneCard::class, 'ImStillStanding' => Card\Passive\ImStillStandingCard::class, 'MonkeyVillage' => Card\Passive\MonkeyVillageCard::class, diff --git a/api/src/Game/Card/Passive/DeadCatCard.php b/api/src/Game/Card/Passive/DeadCatCard.php new file mode 100644 index 00000000..16c3d4e1 --- /dev/null +++ b/api/src/Game/Card/Passive/DeadCatCard.php @@ -0,0 +1,71 @@ + $this->getValue(self::REVIVE_HP), 'value2' => $this->counter]); + } + + public function onPlayerDeath(GameContext $gameContext, string $deadPlayerId): void + { + if ($deadPlayerId !== $this->getOwnerId()) { + return; + } + + $player = $gameContext->getPlayerStateById($this->getOwnerId()); + + $gameContext->heal(abs(min(0, $player->healthPoints)) + self::REVIVE_HP, $this->getOwnerId()); + + $gameContext->pushGameEvent(GameEventTypeEnum::CARD_STATE_UPDATED, [ + 'cardId' => $this->getInstanceId(), + 'playerId' => $this->getOwnerId(), + 'stateToUpdate' => [ + 'counter' => --$this->counter, + ], + ]); + + if ($this->counter <= 0) { + $gameContext->discardCard($this->getInstanceId()); + } + } + + public function setState(CardState $state): void + { + parent::setState($state); + + $this->counter = $state->values['counter'] ?? 9; + } + + public function getSerie(): CardSetEnum + { + return CardSetEnum::TBOI; + } + + public function getRarity(): CardRarityEnum + { + return CardRarityEnum::RARE; + } +} diff --git a/api/templates/dev/passive.tpl.php b/api/templates/dev/passive.tpl.php new file mode 100644 index 00000000..2c2d26f6 --- /dev/null +++ b/api/templates/dev/passive.tpl.php @@ -0,0 +1,15 @@ + + +namespace getNamespace(); ?>; + +getUseStatements(); ?> + +getClassDeclaration(); ?> +{ + + + public function getId(): string + { + return ''; + } +} diff --git a/api/tests/Unit/Game/Card/Passive/DeadCatCardTest.php b/api/tests/Unit/Game/Card/Passive/DeadCatCardTest.php new file mode 100644 index 00000000..12e1f089 --- /dev/null +++ b/api/tests/Unit/Game/Card/Passive/DeadCatCardTest.php @@ -0,0 +1,93 @@ +getCard(); + $ctx = $this->createGameContext(); + + $card->onPlayerDeath($ctx, '2'); + + self::assertCount(0, $ctx->flushEvents()); + } + + public function testOnPlayerDeathHealsAndDecreasesCounter(): void + { + $card = $this->getCard(); + $state = $this->createGameContext()->state; + $ctx = new GameContext($state->withUpdatedPlayer($state->player1->withUpdatedHealth(0)), '1'); + + $card->onPlayerDeath($ctx, '1'); + $events = $ctx->flushEvents(); + + self::assertCount(2, $events); + + self::assertSame(GameEventTypeEnum::HEAL_APPLIED, $events[0]->type); + self::assertSame('1', $events[0]->data['targetId']); + self::assertSame(1, $events[0]->data['amount']); + + self::assertSame(GameEventTypeEnum::CARD_STATE_UPDATED, $events[1]->type); + self::assertSame('test_card', $events[1]->data['cardId']); + self::assertSame('1', $events[1]->data['playerId']); + self::assertSame(8, $events[1]->data['stateToUpdate']['counter']); + } + + public function testOnPlayerDeathHealsMissingHealthPointsWhenNegative(): void + { + $card = $this->getCard(); + $state = $this->createGameContext()->state; + $ctx = new GameContext($state->withUpdatedPlayer($state->player1->withUpdatedHealth(-3)), '1'); + + $card->onPlayerDeath($ctx, '1'); + $events = $ctx->flushEvents(); + + self::assertSame(4, $events[0]->data['amount']); + } + + public function testOnPlayerDeathDiscardsCardWhenCounterReachesZero(): void + { + $card = $this->getCard(); + $card->setState(new CardState('test_card', $card->getId(), '1', values: ['counter' => 1])); + + $state = $this->createGameContext()->state; + $ctx = new GameContext($state->withUpdatedPlayer($state->player1->withUpdatedHealth(0)), '1'); + + $card->onPlayerDeath($ctx, '1'); + $events = $ctx->flushEvents(); + + self::assertCount(3, $events); + self::assertSame(0, $events[1]->data['stateToUpdate']['counter']); + self::assertSame(GameEventTypeEnum::CARD_DISCARDED, $events[2]->type); + self::assertSame('test_card', $events[2]->data['cardId']); + } + + public function testOnPlayerDeathDoesNotDiscardCardWhenCounterAboveZero(): void + { + $card = $this->getCard(); + $card->setState(new CardState('test_card', $card->getId(), '1', values: ['counter' => 2])); + + $state = $this->createGameContext()->state; + $ctx = new GameContext($state->withUpdatedPlayer($state->player1->withUpdatedHealth(0)), '1'); + + $card->onPlayerDeath($ctx, '1'); + $events = $ctx->flushEvents(); + + self::assertCount(2, $events); + } +} diff --git a/api/translations/game.fr.php b/api/translations/game.fr.php index 81802ddc..dd4f1f0a 100644 --- a/api/translations/game.fr.php +++ b/api/translations/game.fr.php @@ -286,6 +286,10 @@ 'name' => 'Festival de Bombes', 'description' => 'Pose toutes les bombes sur le terrain, vous gagnez {{value}} dégâts pour chaque bombe posée.', ], + 'DeadCat' => [ + 'name' => 'Chat mort', + 'description' => 'Quand le joueur meurt, il revient à la vie avec {{value}} PV. Peut être utilisé {{value2}} fois avant d\'être défaussé.', + ], ], // Effects 'effects' => [ From 9f732f2aa3d5d8303aa2beb85cb0d991f0b870ee Mon Sep 17 00:00:00 2001 From: Fan2Shrek Date: Sun, 23 Aug 2026 12:35:39 +0200 Subject: [PATCH 2/2] [API] Fix replay tests --- api/src/Command/ImportGameReplayCommand.php | 1 + api/tests/GameReplay/resources/replay2.php | 48 +- api/tests/GameReplay/resources/replay3.php | 54 ++- api/tests/GameReplay/resources/replay4.php | 513 ++++++-------------- api/tests/GameReplay/resources/replay5.php | 112 +++-- makefile | 22 +- 6 files changed, 321 insertions(+), 429 deletions(-) diff --git a/api/src/Command/ImportGameReplayCommand.php b/api/src/Command/ImportGameReplayCommand.php index 175f2bc5..0dcc686b 100644 --- a/api/src/Command/ImportGameReplayCommand.php +++ b/api/src/Command/ImportGameReplayCommand.php @@ -63,6 +63,7 @@ public function __invoke(#[Argument('filePath')] string $filePath, OutputInterfa } $output->writeln(sprintf('File "%s" imported successfully.', $filePath)); + $output->writeln($id); return 0; } diff --git a/api/tests/GameReplay/resources/replay2.php b/api/tests/GameReplay/resources/replay2.php index 038b77cb..75eabd0c 100644 --- a/api/tests/GameReplay/resources/replay2.php +++ b/api/tests/GameReplay/resources/replay2.php @@ -117,7 +117,7 @@ ], 'lastEventId' => [ null, - 31 => 221, + 31 => 258, ], 'seed' => [ 762201701, @@ -384,8 +384,8 @@ 15 => [], 18 => [], 46 => [ - '88fd869f-ccda-4772-a165-cf37419d4b55' => 'PierreSaidNoMonsterZone', '12e05ab9-6353-4340-a545-0eb421d9c2a8' => 'Redbloons', + '88fd869f-ccda-4772-a165-cf37419d4b55' => 'PierreSaidNoMonsterZone', ], 48 => [ 'a1bcbc4d-497a-49d0-9581-e59e376c872b' => 'D6', @@ -417,16 +417,16 @@ ], 'App\\Game\\State\\GameEvent' => [ 'id' => [ - 21 => 213, - 214, - 215, - 216, - 217, - 218, - 219, - 220, - 221, - 222, + 21 => 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, ], 'type' => [ 21 => \App\Enum\GameEventTypeEnum::CARD_PLAYED, @@ -490,6 +490,30 @@ 'value' => '63a221c9-3b3a-4702-8d37-072730bb06d1', ], ], + 'parentId' => [ + 21 => null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + 'localId' => [ + 21 => 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], ], 'App\\Game\\Card\\Effect\\EffectState' => [ 'effect' => [ diff --git a/api/tests/GameReplay/resources/replay3.php b/api/tests/GameReplay/resources/replay3.php index 717c13ff..ff94e9f8 100644 --- a/api/tests/GameReplay/resources/replay3.php +++ b/api/tests/GameReplay/resources/replay3.php @@ -140,7 +140,7 @@ ], 'lastEventId' => [ null, - 33 => 81, + 33 => 271, ], 'seed' => [ 2642978201, @@ -502,18 +502,18 @@ ], 'App\\Game\\State\\GameEvent' => [ 'id' => [ - 21 => 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, + 21 => 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, ], 'type' => [ 21 => \App\Enum\GameEventTypeEnum::TURN_ENDED, @@ -585,6 +585,34 @@ 'playerId' => '1', ], ], + 'parentId' => [ + 21 => null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + 'localId' => [ + 21 => 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], ], 'App\\Game\\Card\\Effect\\EffectState' => [ 'effect' => [ diff --git a/api/tests/GameReplay/resources/replay4.php b/api/tests/GameReplay/resources/replay4.php index 0819f4b4..6f280b04 100644 --- a/api/tests/GameReplay/resources/replay4.php +++ b/api/tests/GameReplay/resources/replay4.php @@ -34,55 +34,19 @@ clone $p['App\\Game\\State\\GameEvent'], clone $p['App\\Game\\State\\GameState'], clone $p['App\\Game\\Card\\CardState'], - clone ($p['App\\Game\\Card\\Effect\\EffectState'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('App\\Game\\Card\\Effect\\EffectState')), clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], - clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], - clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], - clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], - clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], - clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], - clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], - clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], - clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], - clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], - clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], - clone $p['App\\Game\\Card\\CardState'], - clone $p['App\\Game\\Card\\Effect\\EffectState'], clone $p['App\\Game\\GameRandomizer'], clone $p['App\\Game\\State\\PlayerState'], clone $p['App\\Game\\State\\PlayArea'], @@ -118,47 +82,47 @@ ], 29 => [ '894d8591-64d9-48c7-a2fa-89a46e5298ac' => $o[30], - 'd5ba1516-39a9-4101-b3e5-816524167417' => $o[32], - '0f0ebaba-4a8c-441c-b8ba-9b24ad0438b6' => $o[34], - '6158fa60-324c-4abe-b1f1-95627c68bfe3' => $o[36], - 'bf3d58f8-2137-4eb0-ba67-d7ecb73ba522' => $o[38], - '7f183bad-d397-4e95-828b-ab2206f9aa02' => $o[40], - '781a30cb-8d1d-489f-b1a7-ef346f5f5ca4' => $o[42], - '5b522894-e2cb-4432-940a-19ffab6ccea8' => $o[44], - '9cacc6ec-ba64-44eb-b5a5-37560642b756' => $o[46], - 'caf1469c-b889-498e-9f17-6450c6b6d4e9' => $o[48], - '7d9a06f8-e062-4126-b162-ed62ff9e3b01' => $o[50], - 'fe0c69f5-ad40-4749-b65d-7347dd066943' => $o[52], - '853a75dd-90e3-445f-aa4c-c545eac38d2d' => $o[54], - '585403c2-72a7-4a0c-b7f8-50f123c2fbcb' => $o[56], - '01525636-008e-4367-8ef4-286dcdd60759' => $o[58], - 'a141d5b4-3e8e-4e43-b2fa-45e48bdc34c1' => $o[60], - 609611578 => $o[62], - '88c158e1-b572-49a7-8629-8db3a3201bd1' => $o[64], - 1814215535 => $o[66], - '48734a14-8818-4fdf-a001-547151794dee' => $o[68], - 'f352c9c9-00ca-4b45-adf1-c1133a5e4d45' => $o[70], - '56845a9f-c19f-4699-8490-8b33e0720f10' => $o[72], - 691826370 => $o[74], - 'a6dfce46-2eba-462a-b81d-150fcf59f022' => $o[76], - 1546137632 => $o[78], + 'd5ba1516-39a9-4101-b3e5-816524167417' => $o[31], + '0f0ebaba-4a8c-441c-b8ba-9b24ad0438b6' => $o[3], + '6158fa60-324c-4abe-b1f1-95627c68bfe3' => $o[4], + 'bf3d58f8-2137-4eb0-ba67-d7ecb73ba522' => $o[5], + '7f183bad-d397-4e95-828b-ab2206f9aa02' => $o[6], + '781a30cb-8d1d-489f-b1a7-ef346f5f5ca4' => $o[7], + '5b522894-e2cb-4432-940a-19ffab6ccea8' => $o[8], + '9cacc6ec-ba64-44eb-b5a5-37560642b756' => $o[9], + 'caf1469c-b889-498e-9f17-6450c6b6d4e9' => $o[10], + '7d9a06f8-e062-4126-b162-ed62ff9e3b01' => $o[11], + 'fe0c69f5-ad40-4749-b65d-7347dd066943' => $o[12], + '853a75dd-90e3-445f-aa4c-c545eac38d2d' => $o[13], + '585403c2-72a7-4a0c-b7f8-50f123c2fbcb' => $o[32], + '01525636-008e-4367-8ef4-286dcdd60759' => $o[33], + 'a141d5b4-3e8e-4e43-b2fa-45e48bdc34c1' => $o[34], + 609611578 => $o[35], + '88c158e1-b572-49a7-8629-8db3a3201bd1' => $o[36], + 1814215535 => $o[37], + '48734a14-8818-4fdf-a001-547151794dee' => $o[38], + 'f352c9c9-00ca-4b45-adf1-c1133a5e4d45' => $o[39], + '56845a9f-c19f-4699-8490-8b33e0720f10' => $o[40], + 691826370 => $o[41], + 'a6dfce46-2eba-462a-b81d-150fcf59f022' => $o[42], + 1546137632 => $o[43], ], ], 'randomizer' => [ $o[14], - 29 => $o[80], + 29 => $o[44], ], 'player1' => [ $o[15], - 29 => $o[81], + 29 => $o[45], ], 'player2' => [ $o[18], - 29 => $o[83], + 29 => $o[47], ], 'lastEventId' => [ null, - 29 => 57, + 29 => 279, ], 'seed' => [ 2188139164, @@ -181,30 +145,19 @@ 'fe0c69f5-ad40-4749-b65d-7347dd066943', '853a75dd-90e3-445f-aa4c-c545eac38d2d', 30 => '894d8591-64d9-48c7-a2fa-89a46e5298ac', - 32 => 'd5ba1516-39a9-4101-b3e5-816524167417', - 34 => '0f0ebaba-4a8c-441c-b8ba-9b24ad0438b6', - 36 => '6158fa60-324c-4abe-b1f1-95627c68bfe3', - 38 => 'bf3d58f8-2137-4eb0-ba67-d7ecb73ba522', - 40 => '7f183bad-d397-4e95-828b-ab2206f9aa02', - 42 => '781a30cb-8d1d-489f-b1a7-ef346f5f5ca4', - 44 => '5b522894-e2cb-4432-940a-19ffab6ccea8', - 46 => '9cacc6ec-ba64-44eb-b5a5-37560642b756', - 48 => 'caf1469c-b889-498e-9f17-6450c6b6d4e9', - 50 => '7d9a06f8-e062-4126-b162-ed62ff9e3b01', - 52 => 'fe0c69f5-ad40-4749-b65d-7347dd066943', - 54 => '853a75dd-90e3-445f-aa4c-c545eac38d2d', - 56 => '585403c2-72a7-4a0c-b7f8-50f123c2fbcb', - 58 => '01525636-008e-4367-8ef4-286dcdd60759', - 60 => 'a141d5b4-3e8e-4e43-b2fa-45e48bdc34c1', - 62 => '609611578', - 64 => '88c158e1-b572-49a7-8629-8db3a3201bd1', - 66 => '1814215535', - 68 => '48734a14-8818-4fdf-a001-547151794dee', - 70 => 'f352c9c9-00ca-4b45-adf1-c1133a5e4d45', - 72 => '56845a9f-c19f-4699-8490-8b33e0720f10', - 74 => '691826370', - 76 => 'a6dfce46-2eba-462a-b81d-150fcf59f022', - 78 => '1546137632', + 'd5ba1516-39a9-4101-b3e5-816524167417', + '585403c2-72a7-4a0c-b7f8-50f123c2fbcb', + '01525636-008e-4367-8ef4-286dcdd60759', + 'a141d5b4-3e8e-4e43-b2fa-45e48bdc34c1', + '609611578', + '88c158e1-b572-49a7-8629-8db3a3201bd1', + '1814215535', + '48734a14-8818-4fdf-a001-547151794dee', + 'f352c9c9-00ca-4b45-adf1-c1133a5e4d45', + '56845a9f-c19f-4699-8490-8b33e0720f10', + '691826370', + 'a6dfce46-2eba-462a-b81d-150fcf59f022', + '1546137632', ], 'templateId' => [ 1 => 'Charlie', @@ -221,30 +174,19 @@ 'GrilledClotty', 'Fortnite', 30 => 'Charlie', - 32 => 'Charlie', - 34 => 'MimeticPrismRuby', - 36 => 'SuperMonkey', - 38 => 'Dart', - 40 => 'AlchemistMonkey', - 42 => 'CeramicBloon', - 44 => 'consolation_prices', - 46 => 'MimeticPrismSaphir', - 48 => 'Henry', - 50 => 'Gitman', - 52 => 'GrilledClotty', - 54 => 'Fortnite', - 56 => 'MegaClotty', - 58 => 'Pills', - 60 => 'MimeticPrismRuby', - 62 => 'Play2Hurt', - 64 => 'Justice', - 66 => 'Play2Hurt', - 68 => 'ViciousBee', - 70 => 'WizardMonkey', - 72 => 'NinjaMonkey', - 74 => 'StackyStackito', - 76 => 'PierreSaidNoMonsterZone', - 78 => 'HackedZone', + 'Charlie', + 'MegaClotty', + 'Pills', + 'MimeticPrismRuby', + 'BloodSucker', + 'Justice', + 'MonkeyVillage', + 'ViciousBee', + 'WizardMonkey', + 'NinjaMonkey', + 'ImStillStanding', + 'PierreSaidNoMonsterZone', + 'Play2Hurt', ], 'ownerId' => [ 1 => '2', @@ -261,30 +203,19 @@ '2', '1', 30 => '2', - 32 => '1', - 34 => '1', - 36 => '1', - 38 => '1', - 40 => '1', - 42 => '1', - 44 => '2', - 46 => '2', - 48 => '2', - 50 => '2', - 52 => '2', - 54 => '1', - 56 => '2', - 58 => '1', - 60 => '2', - 62 => '2', - 64 => '1', - 66 => '1', - 68 => '2', - 70 => '1', - 72 => '2', - 74 => '2', - 76 => '1', - 78 => '1', + '1', + '2', + '1', + '2', + '2', + '1', + '1', + '2', + '1', + '2', + '2', + '1', + '1', ], 'effects' => [ 1 => [], @@ -300,81 +231,20 @@ [], [], [], - 30 => [ - $o[31], - ], - 32 => [ - $o[33], - ], - 34 => [ - $o[35], - ], - 36 => [ - $o[37], - ], - 38 => [ - $o[39], - ], - 40 => [ - $o[41], - ], - 42 => [ - $o[43], - ], - 44 => [ - $o[45], - ], - 46 => [ - $o[47], - ], - 48 => [ - $o[49], - ], - 50 => [ - $o[51], - ], - 52 => [ - $o[53], - ], - 54 => [ - $o[55], - ], - 56 => [ - $o[57], - ], - 58 => [ - $o[59], - ], - 60 => [ - $o[61], - ], - 62 => [ - $o[63], - ], - 64 => [ - $o[65], - ], - 66 => [ - $o[67], - ], - 68 => [ - $o[69], - ], - 70 => [ - $o[71], - ], - 72 => [ - $o[73], - ], - 74 => [ - $o[75], - ], - 76 => [ - $o[77], - ], - 78 => [ - $o[79], - ], + 30 => [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], ], 'values' => [ 1 => [], @@ -393,58 +263,47 @@ 30 => [ 'turnRemainingBeforeAction' => 2, ], - 32 => [ + [ 'turnRemainingBeforeAction' => 2, ], - 34 => [], - 36 => [], - 38 => [], - 40 => [], - 42 => [], - 44 => [], - 46 => [], - 48 => [], - 50 => [], - 52 => [], - 54 => [], - 56 => [], - 58 => [], - 60 => [], - 62 => [], - 64 => [], - 66 => [], - 68 => [], - 70 => [], - 72 => [], - 74 => [], - 76 => [], - 78 => [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], ], ], 'App\\Game\\State\\PlayerState' => [ 'player' => [ 15 => $o[16], 18 => $o[19], - 81 => $o[16], - 83 => $o[19], + 45 => $o[16], + 47 => $o[19], ], 'healthPoints' => [ 15 => 125, 18 => 125, - 81 => 125, - 83 => 125, + 45 => 95, + 47 => 95, ], 'maxHealthPoints' => [ 15 => 125, 18 => 125, - 81 => 125, - 83 => 125, + 45 => 125, + 47 => 125, ], 'characterCardId' => [ 15 => 'd5ba1516-39a9-4101-b3e5-816524167417', 18 => '894d8591-64d9-48c7-a2fa-89a46e5298ac', - 81 => 'd5ba1516-39a9-4101-b3e5-816524167417', - 83 => '894d8591-64d9-48c7-a2fa-89a46e5298ac', + 45 => 'd5ba1516-39a9-4101-b3e5-816524167417', + 47 => '894d8591-64d9-48c7-a2fa-89a46e5298ac', ], 'hand' => [ 15 => [ @@ -462,7 +321,7 @@ '7d9a06f8-e062-4126-b162-ed62ff9e3b01', 'fe0c69f5-ad40-4749-b65d-7347dd066943', ], - 81 => [ + 45 => [ '0f0ebaba-4a8c-441c-b8ba-9b24ad0438b6', '6158fa60-324c-4abe-b1f1-95627c68bfe3', 'bf3d58f8-2137-4eb0-ba67-d7ecb73ba522', @@ -474,7 +333,7 @@ 'f352c9c9-00ca-4b45-adf1-c1133a5e4d45', 'a6dfce46-2eba-462a-b81d-150fcf59f022', ], - 83 => [ + 47 => [ '5b522894-e2cb-4432-940a-19ffab6ccea8', '9cacc6ec-ba64-44eb-b5a5-37560642b756', 'caf1469c-b889-498e-9f17-6450c6b6d4e9', @@ -580,7 +439,7 @@ '896c0d4f-7572-4b9d-95ac-2ae6374f2e25' => 'SuperMonkey', '3c3d5d2e-97d4-4c2b-a138-0c6b9f8b1c76' => 'MOAB', ], - 81 => [ + 45 => [ 'b2e19311-7292-4efc-a683-0999d6309a5e' => 'SniperMonkey', '0e6728dc-c0ef-4547-8354-7ad61c512af9' => 'Clotty', '48600176-141d-4875-a8db-74c3ffe5977e' => 'consolation_prices', @@ -622,7 +481,7 @@ '0d5d8bfb-5fbe-4031-a3e3-a1a9ca6fe422' => 'Gitman', '1d54f5a9-d9e5-4154-8b53-489e7fffa8a4' => 'D6', ], - 83 => [ + 47 => [ '1dfc538d-3618-437c-af15-cf189c5888aa' => 'BoomerangMonkey', '657bc04a-6f80-4a0e-8210-009376deed5a' => 'D6', '178778df-d029-4f41-b577-2c075041678f' => 'Bomb', @@ -669,20 +528,20 @@ 'coins' => [ 15 => 8, 18 => 5, - 81 => 20, - 83 => 17, + 45 => 20, + 47 => 17, ], 'playArea' => [ 15 => $o[17], 18 => $o[20], - 81 => $o[82], - 83 => $o[84], + 45 => $o[46], + 47 => $o[48], ], 'discardPile' => [ 15 => [], 18 => [], - 81 => [], - 83 => [], + 45 => [], + 47 => [], ], ], 'App\\Game\\Player' => [ @@ -699,11 +558,11 @@ 'passiveCards' => [ 17 => [], 20 => [], - 82 => [ + 46 => [ '1814215535', '1546137632', ], - 84 => [ + 48 => [ '609611578', '691826370', ], @@ -711,20 +570,20 @@ 'monsterCards' => [ 17 => [], 20 => [], - 82 => [], - 84 => [], + 46 => [], + 48 => [], ], ], 'App\\Game\\State\\GameEvent' => [ 'id' => [ - 21 => 48, - 49, - 51, - 52, - 53, - 54, - 55, - 57, + 21 => 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, ], 'type' => [ 21 => \App\Enum\GameEventTypeEnum::TURN_ENDED, @@ -772,111 +631,25 @@ 'playerId' => '2', ], ], - ], - 'App\\Game\\Card\\Effect\\EffectState' => [ - 'effect' => [ - 31 => \App\Enum\CardEffectEnum::HACKED, - 33 => \App\Enum\CardEffectEnum::HACKED, - 35 => \App\Enum\CardEffectEnum::HACKED, - 37 => \App\Enum\CardEffectEnum::HACKED, - 39 => \App\Enum\CardEffectEnum::HACKED, - 41 => \App\Enum\CardEffectEnum::HACKED, - 43 => \App\Enum\CardEffectEnum::HACKED, - 45 => \App\Enum\CardEffectEnum::HACKED, - 47 => \App\Enum\CardEffectEnum::HACKED, - 49 => \App\Enum\CardEffectEnum::HACKED, - 51 => \App\Enum\CardEffectEnum::HACKED, - 53 => \App\Enum\CardEffectEnum::HACKED, - 55 => \App\Enum\CardEffectEnum::HACKED, - 57 => \App\Enum\CardEffectEnum::HACKED, - 59 => \App\Enum\CardEffectEnum::HACKED, - 61 => \App\Enum\CardEffectEnum::HACKED, - 63 => \App\Enum\CardEffectEnum::HACKED, - 65 => \App\Enum\CardEffectEnum::HACKED, - 67 => \App\Enum\CardEffectEnum::HACKED, - 69 => \App\Enum\CardEffectEnum::HACKED, - 71 => \App\Enum\CardEffectEnum::HACKED, - 73 => \App\Enum\CardEffectEnum::HACKED, - 75 => \App\Enum\CardEffectEnum::HACKED, - 77 => \App\Enum\CardEffectEnum::HACKED, - 79 => \App\Enum\CardEffectEnum::HACKED, + 'parentId' => [ + 21 => null, + null, + null, + null, + null, + null, + null, + null, ], - 'data' => [ - 31 => [ - 'value' => 55, - ], - 33 => [ - 'value' => 253, - ], - 35 => [ - 'value' => 104, - ], - 37 => [ - 'value' => 210, - ], - 39 => [ - 'value' => 143, - ], - 41 => [ - 'value' => 57, - ], - 43 => [ - 'value' => 54, - ], - 45 => [ - 'value' => 266, - ], - 47 => [ - 'value' => 71, - ], - 49 => [ - 'value' => 255, - ], - 51 => [ - 'value' => 123, - ], - 53 => [ - 'value' => 147, - ], - 55 => [ - 'value' => 56, - ], - 57 => [ - 'value' => 126, - ], - 59 => [ - 'value' => 97, - ], - 61 => [ - 'value' => 280, - ], - 63 => [ - 'value' => 192, - ], - 65 => [ - 'value' => 225, - ], - 67 => [ - 'value' => 278, - ], - 69 => [ - 'value' => 234, - ], - 71 => [ - 'value' => 223, - ], - 73 => [ - 'value' => 174, - ], - 75 => [ - 'value' => 74, - ], - 77 => [ - 'value' => 236, - ], - 79 => [ - 'value' => 164, - ], + 'localId' => [ + 21 => 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, ], ], ], @@ -899,7 +672,7 @@ 'seed' => 2188139164, 'engine' => 'O:21:"Random\\Engine\\Mt19937":2:{i:0;a:0:{}i:1;a:626:{i:0;s:8:"e0966814";i:1;s:8:"3bbc60da";i:2;s:8:"f1925ab4";i:3;s:8:"90b72f38";i:4;s:8:"7c6b9e17";i:5;s:8:"93ed7816";i:6;s:8:"ae59d915";i:7;s:8:"b335815a";i:8;s:8:"7c301a8a";i:9;s:8:"12fcb305";i:10;s:8:"f8d222c1";i:11;s:8:"c8ceb4e3";i:12;s:8:"55ca4190";i:13;s:8:"9f15eb19";i:14;s:8:"90632c55";i:15;s:8:"09018d2c";i:16;s:8:"81595c90";i:17;s:8:"44aa8ec4";i:18;s:8:"ef203bbe";i:19;s:8:"a2e87ac5";i:20;s:8:"5f8cb80f";i:21;s:8:"74c39e54";i:22;s:8:"4ea98448";i:23;s:8:"b2c3d1a4";i:24;s:8:"18313e32";i:25;s:8:"5d5d3306";i:26;s:8:"2a486cb7";i:27;s:8:"eba6961d";i:28;s:8:"f2c84609";i:29;s:8:"b89f938f";i:30;s:8:"b9da8254";i:31;s:8:"91c77507";i:32;s:8:"251a747d";i:33;s:8:"f64475b7";i:34;s:8:"1a65a2c2";i:35;s:8:"8e3e7f97";i:36;s:8:"e47c658a";i:37;s:8:"7056a2ef";i:38;s:8:"25dadcb1";i:39;s:8:"caec0bd0";i:40;s:8:"5f037f2f";i:41;s:8:"b8347a95";i:42;s:8:"97e46882";i:43;s:8:"42634a8d";i:44;s:8:"aba61c64";i:45;s:8:"364e0353";i:46;s:8:"76fc722f";i:47;s:8:"ff91eab5";i:48;s:8:"49619df6";i:49;s:8:"76ccc01b";i:50;s:8:"8be1f59e";i:51;s:8:"ab82773b";i:52;s:8:"36cc24b9";i:53;s:8:"6f7a619c";i:54;s:8:"b6e1a3b2";i:55;s:8:"d9932bb8";i:56;s:8:"a8ca020f";i:57;s:8:"ab0da5aa";i:58;s:8:"ad3a66e0";i:59;s:8:"100efc35";i:60;s:8:"f8aba263";i:61;s:8:"b5d993cb";i:62;s:8:"a5519117";i:63;s:8:"017a322e";i:64;s:8:"f214c747";i:65;s:8:"3b48cdeb";i:66;s:8:"1e373129";i:67;s:8:"80471f9e";i:68;s:8:"fa4857f4";i:69;s:8:"02a2e380";i:70;s:8:"b3c98b47";i:71;s:8:"9b7925b9";i:72;s:8:"0d834740";i:73;s:8:"8223268c";i:74;s:8:"35c5a36e";i:75;s:8:"735b3f33";i:76;s:8:"9d91a9c7";i:77;s:8:"9772400d";i:78;s:8:"c8e1bbfd";i:79;s:8:"b6e21e4d";i:80;s:8:"eb195163";i:81;s:8:"b19010e9";i:82;s:8:"fbf28e91";i:83;s:8:"6a16bbcf";i:84;s:8:"033c434f";i:85;s:8:"24c9e67a";i:86;s:8:"13bbabd7";i:87;s:8:"c8fcec9b";i:88;s:8:"d7011bb6";i:89;s:8:"17349501";i:90;s:8:"b7da87db";i:91;s:8:"22fc30f6";i:92;s:8:"ac733d65";i:93;s:8:"0a31bcc2";i:94;s:8:"3107f72e";i:95;s:8:"7c15583c";i:96;s:8:"d92350bb";i:97;s:8:"89147422";i:98;s:8:"debdb07d";i:99;s:8:"88cd3185";i:100;s:8:"3a3525fe";i:101;s:8:"03714991";i:102;s:8:"93d0ff17";i:103;s:8:"5ac2440f";i:104;s:8:"449b34c8";i:105;s:8:"2174f5b2";i:106;s:8:"64b76e43";i:107;s:8:"97adbacd";i:108;s:8:"22ee26c4";i:109;s:8:"11d09037";i:110;s:8:"ab98c703";i:111;s:8:"872a795d";i:112;s:8:"e40fdf9c";i:113;s:8:"bd7b10be";i:114;s:8:"b4500136";i:115;s:8:"1e5f0919";i:116;s:8:"15d05329";i:117;s:8:"17872673";i:118;s:8:"6e11373d";i:119;s:8:"9fa2c2fa";i:120;s:8:"aa24dcab";i:121;s:8:"ebbd821a";i:122;s:8:"00d077cf";i:123;s:8:"506937f0";i:124;s:8:"35d8dcb6";i:125;s:8:"360c984f";i:126;s:8:"125c770f";i:127;s:8:"9265f66d";i:128;s:8:"46a2841b";i:129;s:8:"ec595a06";i:130;s:8:"ddbfe628";i:131;s:8:"47fbe5b5";i:132;s:8:"b37f80fc";i:133;s:8:"393dd9a0";i:134;s:8:"cdeb152a";i:135;s:8:"349d7fc6";i:136;s:8:"08dccf1b";i:137;s:8:"f6c4b19e";i:138;s:8:"5b8eeded";i:139;s:8:"36dc4241";i:140;s:8:"89d8141d";i:141;s:8:"9026fd9f";i:142;s:8:"ad17de35";i:143;s:8:"04e7ab81";i:144;s:8:"7336e295";i:145;s:8:"bf41ac8a";i:146;s:8:"813876c4";i:147;s:8:"254cd1e9";i:148;s:8:"9986bfb0";i:149;s:8:"37f2c0de";i:150;s:8:"102e6931";i:151;s:8:"c18850e4";i:152;s:8:"509c692e";i:153;s:8:"53aa75a8";i:154;s:8:"11595ca5";i:155;s:8:"9d90f44e";i:156;s:8:"f4696f97";i:157;s:8:"d7c08b94";i:158;s:8:"9c47c32f";i:159;s:8:"3590b915";i:160;s:8:"b0463f1d";i:161;s:8:"15c367b8";i:162;s:8:"1f63b3c7";i:163;s:8:"628ad5ee";i:164;s:8:"50a79382";i:165;s:8:"b8190495";i:166;s:8:"723b495d";i:167;s:8:"6a13f759";i:168;s:8:"5b6efbba";i:169;s:8:"db59358f";i:170;s:8:"0086bfea";i:171;s:8:"2593af1a";i:172;s:8:"c4e37058";i:173;s:8:"ad40b6b4";i:174;s:8:"0e482a0e";i:175;s:8:"321bee9b";i:176;s:8:"256f9e13";i:177;s:8:"99c66bf6";i:178;s:8:"deb2bf0b";i:179;s:8:"b07b651f";i:180;s:8:"a3ff843a";i:181;s:8:"e89685df";i:182;s:8:"a3d5b016";i:183;s:8:"821a2237";i:184;s:8:"875f45c6";i:185;s:8:"ccc145a0";i:186;s:8:"afeeb0fe";i:187;s:8:"07f30fc6";i:188;s:8:"c997d17c";i:189;s:8:"2ac63863";i:190;s:8:"b3ba99d9";i:191;s:8:"840a889b";i:192;s:8:"2adb40cf";i:193;s:8:"8969ab1b";i:194;s:8:"dac99ce8";i:195;s:8:"c3691174";i:196;s:8:"f0f7152d";i:197;s:8:"49018e60";i:198;s:8:"6b9968cd";i:199;s:8:"143adf1f";i:200;s:8:"1dc7212f";i:201;s:8:"f9d86c9b";i:202;s:8:"871753c4";i:203;s:8:"06c7aa21";i:204;s:8:"9569c4cd";i:205;s:8:"c1f61c34";i:206;s:8:"8cad81d9";i:207;s:8:"ced71216";i:208;s:8:"fcccf05c";i:209;s:8:"f90ef99d";i:210;s:8:"7a9b4293";i:211;s:8:"bb4c6424";i:212;s:8:"4adada50";i:213;s:8:"7c8125bf";i:214;s:8:"8e9377e3";i:215;s:8:"b9d88262";i:216;s:8:"352b047b";i:217;s:8:"dc4f433e";i:218;s:8:"d15988d9";i:219;s:8:"b1c20d10";i:220;s:8:"b6304c0a";i:221;s:8:"a603c5a2";i:222;s:8:"e8d4887f";i:223;s:8:"9940ee60";i:224;s:8:"2694af55";i:225;s:8:"b0c57c6d";i:226;s:8:"83b6f8ed";i:227;s:8:"3157a251";i:228;s:8:"035c0640";i:229;s:8:"cde74c75";i:230;s:8:"25e56c27";i:231;s:8:"049e2358";i:232;s:8:"7dc7eeef";i:233;s:8:"cbdcbf63";i:234;s:8:"2fdc1505";i:235;s:8:"7e971290";i:236;s:8:"683364e7";i:237;s:8:"d3f2daa6";i:238;s:8:"e9b7f8ea";i:239;s:8:"4d209cf7";i:240;s:8:"3ced9420";i:241;s:8:"35cb21fe";i:242;s:8:"d6cdfcf0";i:243;s:8:"cfd3017b";i:244;s:8:"d131610c";i:245;s:8:"6fe35b04";i:246;s:8:"ec8af631";i:247;s:8:"13afbe43";i:248;s:8:"7651fdb7";i:249;s:8:"e0af7c59";i:250;s:8:"4eb2f614";i:251;s:8:"f0551e5c";i:252;s:8:"e4e11027";i:253;s:8:"3c49475c";i:254;s:8:"533a2fda";i:255;s:8:"5da738f1";i:256;s:8:"d738123b";i:257;s:8:"4852116e";i:258;s:8:"d8026d36";i:259;s:8:"fb0620e3";i:260;s:8:"6c6ed2a2";i:261;s:8:"b0a75f8c";i:262;s:8:"abde8f63";i:263;s:8:"6f3a4eeb";i:264;s:8:"d9253eb5";i:265;s:8:"e853eaf2";i:266;s:8:"734fdd7d";i:267;s:8:"9b3eb62c";i:268;s:8:"5848a470";i:269;s:8:"f5a8ad9f";i:270;s:8:"ac462717";i:271;s:8:"5e472a83";i:272;s:8:"96f7388e";i:273;s:8:"ff37ceb2";i:274;s:8:"d5e579bb";i:275;s:8:"c8b9198c";i:276;s:8:"54f51120";i:277;s:8:"f3d0ed28";i:278;s:8:"1ab40984";i:279;s:8:"61bd99e2";i:280;s:8:"ca77d771";i:281;s:8:"a274a7c7";i:282;s:8:"fdd90da0";i:283;s:8:"6a4ec634";i:284;s:8:"60fa4084";i:285;s:8:"812bb13f";i:286;s:8:"31bb723e";i:287;s:8:"6db4816d";i:288;s:8:"9ec0563e";i:289;s:8:"9f7a5a69";i:290;s:8:"8a1cd966";i:291;s:8:"9bcc4b77";i:292;s:8:"7686f1a3";i:293;s:8:"91274957";i:294;s:8:"319338ba";i:295;s:8:"93260336";i:296;s:8:"17ab3293";i:297;s:8:"6d1b6c4d";i:298;s:8:"d4404555";i:299;s:8:"c65c9432";i:300;s:8:"e290cda4";i:301;s:8:"64060ca6";i:302;s:8:"2301f229";i:303;s:8:"106a399b";i:304;s:8:"9ce8edd8";i:305;s:8:"f84f5656";i:306;s:8:"8d496aca";i:307;s:8:"91fa72bd";i:308;s:8:"b0194a9a";i:309;s:8:"69908a63";i:310;s:8:"22021e3e";i:311;s:8:"c909f30e";i:312;s:8:"b52a3ac4";i:313;s:8:"7027d0d1";i:314;s:8:"bbe2ce02";i:315;s:8:"99f5034e";i:316;s:8:"1b228e94";i:317;s:8:"43924727";i:318;s:8:"cc2f0619";i:319;s:8:"59283449";i:320;s:8:"f61822f5";i:321;s:8:"ca0c32da";i:322;s:8:"990604c0";i:323;s:8:"5d53048f";i:324;s:8:"47425a59";i:325;s:8:"01c1d1ab";i:326;s:8:"3307c5ed";i:327;s:8:"f8511f69";i:328;s:8:"600111f1";i:329;s:8:"4dee4df9";i:330;s:8:"2074d4e2";i:331;s:8:"1ef830b2";i:332;s:8:"fa559590";i:333;s:8:"7b546ad3";i:334;s:8:"8d3d48e7";i:335;s:8:"61d7a442";i:336;s:8:"5dc50c7d";i:337;s:8:"0e8bc91f";i:338;s:8:"051efd97";i:339;s:8:"367c033c";i:340;s:8:"04abbe75";i:341;s:8:"6b0d06dd";i:342;s:8:"d1e424ed";i:343;s:8:"74a75375";i:344;s:8:"444e9fa5";i:345;s:8:"b18ecfcb";i:346;s:8:"52073b04";i:347;s:8:"875835f6";i:348;s:8:"5b1e47a2";i:349;s:8:"7ac22ffe";i:350;s:8:"b98b3485";i:351;s:8:"001a8666";i:352;s:8:"8359e850";i:353;s:8:"a7786c42";i:354;s:8:"578cb3fb";i:355;s:8:"3fc46089";i:356;s:8:"0f138709";i:357;s:8:"9fb87117";i:358;s:8:"9286b4e3";i:359;s:8:"eb66c9b7";i:360;s:8:"8a951e1a";i:361;s:8:"7b13d471";i:362;s:8:"0322d51d";i:363;s:8:"275f088b";i:364;s:8:"88f897d1";i:365;s:8:"895b0386";i:366;s:8:"9fd03339";i:367;s:8:"e4c3e7f6";i:368;s:8:"181fe744";i:369;s:8:"2b5dfad0";i:370;s:8:"0d31842c";i:371;s:8:"5b2f8c94";i:372;s:8:"872fa16b";i:373;s:8:"5fa89dce";i:374;s:8:"4c834919";i:375;s:8:"134febb0";i:376;s:8:"c61cdc7b";i:377;s:8:"f3e8d824";i:378;s:8:"52cb9f5b";i:379;s:8:"4faf5b5f";i:380;s:8:"ff2d739e";i:381;s:8:"7c08b94a";i:382;s:8:"1cf77bbe";i:383;s:8:"cfb91ddb";i:384;s:8:"aa41d249";i:385;s:8:"8162dacb";i:386;s:8:"a1c8d3bd";i:387;s:8:"44796461";i:388;s:8:"ac578eb2";i:389;s:8:"dfcd7eec";i:390;s:8:"f98a23ad";i:391;s:8:"bb970d9c";i:392;s:8:"1cb9083b";i:393;s:8:"3e6f8065";i:394;s:8:"1ea05560";i:395;s:8:"b8789a3e";i:396;s:8:"515961ed";i:397;s:8:"8f69882e";i:398;s:8:"2fa3991f";i:399;s:8:"7ead2c4e";i:400;s:8:"586a1c3a";i:401;s:8:"a363faff";i:402;s:8:"2efd2522";i:403;s:8:"7162537e";i:404;s:8:"9f43348b";i:405;s:8:"4102a2f0";i:406;s:8:"1f285fdb";i:407;s:8:"6fb569f9";i:408;s:8:"160f9ddf";i:409;s:8:"cbeca768";i:410;s:8:"0a099c23";i:411;s:8:"f1226cd6";i:412;s:8:"d25e894f";i:413;s:8:"20798499";i:414;s:8:"eae4c7cd";i:415;s:8:"252be30e";i:416;s:8:"b55cae46";i:417;s:8:"b559ee05";i:418;s:8:"387b8eeb";i:419;s:8:"452bd851";i:420;s:8:"7c13f032";i:421;s:8:"cca20739";i:422;s:8:"10656673";i:423;s:8:"e30c8c28";i:424;s:8:"c58b24c7";i:425;s:8:"447c1cba";i:426;s:8:"baf4d64d";i:427;s:8:"616e1a03";i:428;s:8:"2350c0ee";i:429;s:8:"d3ca1373";i:430;s:8:"90655ac3";i:431;s:8:"d5d65b87";i:432;s:8:"06f30b84";i:433;s:8:"3a799aa8";i:434;s:8:"7177c769";i:435;s:8:"c41b73f4";i:436;s:8:"db231a35";i:437;s:8:"3daa27f8";i:438;s:8:"2a79242d";i:439;s:8:"e6e83529";i:440;s:8:"acd919cd";i:441;s:8:"ce3c757b";i:442;s:8:"f28ec559";i:443;s:8:"28f150b8";i:444;s:8:"c7f9aa2a";i:445;s:8:"f09ad69c";i:446;s:8:"8ad7b39f";i:447;s:8:"efbc52b7";i:448;s:8:"c7241e29";i:449;s:8:"d9be6cbf";i:450;s:8:"464cc722";i:451;s:8:"5e768901";i:452;s:8:"55e7a5e7";i:453;s:8:"2b867952";i:454;s:8:"38b9eac9";i:455;s:8:"d85a0dde";i:456;s:8:"e65eb255";i:457;s:8:"7483a381";i:458;s:8:"308aa0e0";i:459;s:8:"458c519e";i:460;s:8:"dd28f333";i:461;s:8:"bacf8314";i:462;s:8:"1150d92c";i:463;s:8:"305a9fe1";i:464;s:8:"acea2a32";i:465;s:8:"16713320";i:466;s:8:"71a0a4e0";i:467;s:8:"c7d00243";i:468;s:8:"0ac86aaf";i:469;s:8:"1032f1d2";i:470;s:8:"7377d552";i:471;s:8:"c4de5c81";i:472;s:8:"d9d0b845";i:473;s:8:"ccdda742";i:474;s:8:"53ea255d";i:475;s:8:"e54de4cb";i:476;s:8:"40194771";i:477;s:8:"50705085";i:478;s:8:"37019951";i:479;s:8:"9713232f";i:480;s:8:"acca2ceb";i:481;s:8:"4fbceec4";i:482;s:8:"7ff2d245";i:483;s:8:"141a9636";i:484;s:8:"76f008f4";i:485;s:8:"02aa9ffd";i:486;s:8:"c1658582";i:487;s:8:"3b2b2917";i:488;s:8:"f3b00a34";i:489;s:8:"4df87e3a";i:490;s:8:"a873003c";i:491;s:8:"2671cf2e";i:492;s:8:"463c7db4";i:493;s:8:"ee619867";i:494;s:8:"ace73690";i:495;s:8:"bd327a30";i:496;s:8:"c6986375";i:497;s:8:"b96ce429";i:498;s:8:"abdb31ae";i:499;s:8:"b902a354";i:500;s:8:"3d61edf7";i:501;s:8:"3f73cde8";i:502;s:8:"a547617a";i:503;s:8:"cf2d405c";i:504;s:8:"25fd9b37";i:505;s:8:"712808b5";i:506;s:8:"8603d1f1";i:507;s:8:"7610f13b";i:508;s:8:"574e616a";i:509;s:8:"6c249fbc";i:510;s:8:"7ae46ef3";i:511;s:8:"47dc6040";i:512;s:8:"71bd1063";i:513;s:8:"273c6c6c";i:514;s:8:"a6987e95";i:515;s:8:"78889523";i:516;s:8:"80130af6";i:517;s:8:"8f5b319c";i:518;s:8:"2e812199";i:519;s:8:"4db968c6";i:520;s:8:"6f6da47b";i:521;s:8:"036a8602";i:522;s:8:"ca96fdb4";i:523;s:8:"33223156";i:524;s:8:"ade3394f";i:525;s:8:"f82e1432";i:526;s:8:"bd0ec17e";i:527;s:8:"6dcee788";i:528;s:8:"429d329f";i:529;s:8:"45e032a2";i:530;s:8:"a96eee81";i:531;s:8:"9b3787cd";i:532;s:8:"4fcbf08a";i:533;s:8:"97e3c06f";i:534;s:8:"113ed973";i:535;s:8:"bb551a5a";i:536;s:8:"0a69b24c";i:537;s:8:"3396bf8d";i:538;s:8:"aef4ecf8";i:539;s:8:"be86e2bc";i:540;s:8:"c3d80692";i:541;s:8:"f2c6496a";i:542;s:8:"b36bb42d";i:543;s:8:"9034b911";i:544;s:8:"a4ca2800";i:545;s:8:"9271c0d1";i:546;s:8:"f0cfe562";i:547;s:8:"25bb4f26";i:548;s:8:"2c3243b2";i:549;s:8:"c51aa85c";i:550;s:8:"28a3e684";i:551;s:8:"7a3e304b";i:552;s:8:"fbdbf310";i:553;s:8:"7a621b8b";i:554;s:8:"c812f21d";i:555;s:8:"a230f23a";i:556;s:8:"985f84b5";i:557;s:8:"9be95daa";i:558;s:8:"1f06e91c";i:559;s:8:"54b94f88";i:560;s:8:"87edb009";i:561;s:8:"c896fa5c";i:562;s:8:"6529c4de";i:563;s:8:"b1605fd2";i:564;s:8:"e8926d8e";i:565;s:8:"3f2ecc47";i:566;s:8:"1151f23d";i:567;s:8:"1e8ce42c";i:568;s:8:"775c3531";i:569;s:8:"76009abd";i:570;s:8:"301b6ca0";i:571;s:8:"09d62771";i:572;s:8:"da67f8dd";i:573;s:8:"045cdd31";i:574;s:8:"478c15fe";i:575;s:8:"bbae49ba";i:576;s:8:"25dbb457";i:577;s:8:"18eb4397";i:578;s:8:"9e6aa0af";i:579;s:8:"2581ffc2";i:580;s:8:"8a4df421";i:581;s:8:"1ee97b47";i:582;s:8:"b1ff1326";i:583;s:8:"1642041e";i:584;s:8:"41699d9e";i:585;s:8:"9a3cbb05";i:586;s:8:"a71bac58";i:587;s:8:"4aa84d69";i:588;s:8:"e2f1f243";i:589;s:8:"ea9f1388";i:590;s:8:"0fbdd2a7";i:591;s:8:"f52fe152";i:592;s:8:"4c01c5ba";i:593;s:8:"6f190fe2";i:594;s:8:"e6f03497";i:595;s:8:"61585fcc";i:596;s:8:"eb84148e";i:597;s:8:"5d028f4b";i:598;s:8:"35fb9897";i:599;s:8:"70185114";i:600;s:8:"0da1e3f7";i:601;s:8:"aa66b9b0";i:602;s:8:"66dec731";i:603;s:8:"ebab3bd7";i:604;s:8:"84fdfcbf";i:605;s:8:"a47277df";i:606;s:8:"e5653e1b";i:607;s:8:"585438fa";i:608;s:8:"ba2bcf79";i:609;s:8:"c29e5d18";i:610;s:8:"862eb158";i:611;s:8:"02c2c28b";i:612;s:8:"59a081fd";i:613;s:8:"fcbeb747";i:614;s:8:"79a4d799";i:615;s:8:"f21a6087";i:616;s:8:"bdee779a";i:617;s:8:"d08c6853";i:618;s:8:"cc78676a";i:619;s:8:"621f902f";i:620;s:8:"b077448e";i:621;s:8:"32625d77";i:622;s:8:"9f790bf6";i:623;s:8:"211255a7";i:624;i:0;i:625;i:0;}}', ], - -80 => [ + -44 => [ 'seed' => 2188139164, 'engine' => 'O:21:"Random\\Engine\\Mt19937":2:{i:0;a:0:{}i:1;a:626:{i:0;s:8:"e0966814";i:1;s:8:"3bbc60da";i:2;s:8:"f1925ab4";i:3;s:8:"90b72f38";i:4;s:8:"7c6b9e17";i:5;s:8:"93ed7816";i:6;s:8:"ae59d915";i:7;s:8:"b335815a";i:8;s:8:"7c301a8a";i:9;s:8:"12fcb305";i:10;s:8:"f8d222c1";i:11;s:8:"c8ceb4e3";i:12;s:8:"55ca4190";i:13;s:8:"9f15eb19";i:14;s:8:"90632c55";i:15;s:8:"09018d2c";i:16;s:8:"81595c90";i:17;s:8:"44aa8ec4";i:18;s:8:"ef203bbe";i:19;s:8:"a2e87ac5";i:20;s:8:"5f8cb80f";i:21;s:8:"74c39e54";i:22;s:8:"4ea98448";i:23;s:8:"b2c3d1a4";i:24;s:8:"18313e32";i:25;s:8:"5d5d3306";i:26;s:8:"2a486cb7";i:27;s:8:"eba6961d";i:28;s:8:"f2c84609";i:29;s:8:"b89f938f";i:30;s:8:"b9da8254";i:31;s:8:"91c77507";i:32;s:8:"251a747d";i:33;s:8:"f64475b7";i:34;s:8:"1a65a2c2";i:35;s:8:"8e3e7f97";i:36;s:8:"e47c658a";i:37;s:8:"7056a2ef";i:38;s:8:"25dadcb1";i:39;s:8:"caec0bd0";i:40;s:8:"5f037f2f";i:41;s:8:"b8347a95";i:42;s:8:"97e46882";i:43;s:8:"42634a8d";i:44;s:8:"aba61c64";i:45;s:8:"364e0353";i:46;s:8:"76fc722f";i:47;s:8:"ff91eab5";i:48;s:8:"49619df6";i:49;s:8:"76ccc01b";i:50;s:8:"8be1f59e";i:51;s:8:"ab82773b";i:52;s:8:"36cc24b9";i:53;s:8:"6f7a619c";i:54;s:8:"b6e1a3b2";i:55;s:8:"d9932bb8";i:56;s:8:"a8ca020f";i:57;s:8:"ab0da5aa";i:58;s:8:"ad3a66e0";i:59;s:8:"100efc35";i:60;s:8:"f8aba263";i:61;s:8:"b5d993cb";i:62;s:8:"a5519117";i:63;s:8:"017a322e";i:64;s:8:"f214c747";i:65;s:8:"3b48cdeb";i:66;s:8:"1e373129";i:67;s:8:"80471f9e";i:68;s:8:"fa4857f4";i:69;s:8:"02a2e380";i:70;s:8:"b3c98b47";i:71;s:8:"9b7925b9";i:72;s:8:"0d834740";i:73;s:8:"8223268c";i:74;s:8:"35c5a36e";i:75;s:8:"735b3f33";i:76;s:8:"9d91a9c7";i:77;s:8:"9772400d";i:78;s:8:"c8e1bbfd";i:79;s:8:"b6e21e4d";i:80;s:8:"eb195163";i:81;s:8:"b19010e9";i:82;s:8:"fbf28e91";i:83;s:8:"6a16bbcf";i:84;s:8:"033c434f";i:85;s:8:"24c9e67a";i:86;s:8:"13bbabd7";i:87;s:8:"c8fcec9b";i:88;s:8:"d7011bb6";i:89;s:8:"17349501";i:90;s:8:"b7da87db";i:91;s:8:"22fc30f6";i:92;s:8:"ac733d65";i:93;s:8:"0a31bcc2";i:94;s:8:"3107f72e";i:95;s:8:"7c15583c";i:96;s:8:"d92350bb";i:97;s:8:"89147422";i:98;s:8:"debdb07d";i:99;s:8:"88cd3185";i:100;s:8:"3a3525fe";i:101;s:8:"03714991";i:102;s:8:"93d0ff17";i:103;s:8:"5ac2440f";i:104;s:8:"449b34c8";i:105;s:8:"2174f5b2";i:106;s:8:"64b76e43";i:107;s:8:"97adbacd";i:108;s:8:"22ee26c4";i:109;s:8:"11d09037";i:110;s:8:"ab98c703";i:111;s:8:"872a795d";i:112;s:8:"e40fdf9c";i:113;s:8:"bd7b10be";i:114;s:8:"b4500136";i:115;s:8:"1e5f0919";i:116;s:8:"15d05329";i:117;s:8:"17872673";i:118;s:8:"6e11373d";i:119;s:8:"9fa2c2fa";i:120;s:8:"aa24dcab";i:121;s:8:"ebbd821a";i:122;s:8:"00d077cf";i:123;s:8:"506937f0";i:124;s:8:"35d8dcb6";i:125;s:8:"360c984f";i:126;s:8:"125c770f";i:127;s:8:"9265f66d";i:128;s:8:"46a2841b";i:129;s:8:"ec595a06";i:130;s:8:"ddbfe628";i:131;s:8:"47fbe5b5";i:132;s:8:"b37f80fc";i:133;s:8:"393dd9a0";i:134;s:8:"cdeb152a";i:135;s:8:"349d7fc6";i:136;s:8:"08dccf1b";i:137;s:8:"f6c4b19e";i:138;s:8:"5b8eeded";i:139;s:8:"36dc4241";i:140;s:8:"89d8141d";i:141;s:8:"9026fd9f";i:142;s:8:"ad17de35";i:143;s:8:"04e7ab81";i:144;s:8:"7336e295";i:145;s:8:"bf41ac8a";i:146;s:8:"813876c4";i:147;s:8:"254cd1e9";i:148;s:8:"9986bfb0";i:149;s:8:"37f2c0de";i:150;s:8:"102e6931";i:151;s:8:"c18850e4";i:152;s:8:"509c692e";i:153;s:8:"53aa75a8";i:154;s:8:"11595ca5";i:155;s:8:"9d90f44e";i:156;s:8:"f4696f97";i:157;s:8:"d7c08b94";i:158;s:8:"9c47c32f";i:159;s:8:"3590b915";i:160;s:8:"b0463f1d";i:161;s:8:"15c367b8";i:162;s:8:"1f63b3c7";i:163;s:8:"628ad5ee";i:164;s:8:"50a79382";i:165;s:8:"b8190495";i:166;s:8:"723b495d";i:167;s:8:"6a13f759";i:168;s:8:"5b6efbba";i:169;s:8:"db59358f";i:170;s:8:"0086bfea";i:171;s:8:"2593af1a";i:172;s:8:"c4e37058";i:173;s:8:"ad40b6b4";i:174;s:8:"0e482a0e";i:175;s:8:"321bee9b";i:176;s:8:"256f9e13";i:177;s:8:"99c66bf6";i:178;s:8:"deb2bf0b";i:179;s:8:"b07b651f";i:180;s:8:"a3ff843a";i:181;s:8:"e89685df";i:182;s:8:"a3d5b016";i:183;s:8:"821a2237";i:184;s:8:"875f45c6";i:185;s:8:"ccc145a0";i:186;s:8:"afeeb0fe";i:187;s:8:"07f30fc6";i:188;s:8:"c997d17c";i:189;s:8:"2ac63863";i:190;s:8:"b3ba99d9";i:191;s:8:"840a889b";i:192;s:8:"2adb40cf";i:193;s:8:"8969ab1b";i:194;s:8:"dac99ce8";i:195;s:8:"c3691174";i:196;s:8:"f0f7152d";i:197;s:8:"49018e60";i:198;s:8:"6b9968cd";i:199;s:8:"143adf1f";i:200;s:8:"1dc7212f";i:201;s:8:"f9d86c9b";i:202;s:8:"871753c4";i:203;s:8:"06c7aa21";i:204;s:8:"9569c4cd";i:205;s:8:"c1f61c34";i:206;s:8:"8cad81d9";i:207;s:8:"ced71216";i:208;s:8:"fcccf05c";i:209;s:8:"f90ef99d";i:210;s:8:"7a9b4293";i:211;s:8:"bb4c6424";i:212;s:8:"4adada50";i:213;s:8:"7c8125bf";i:214;s:8:"8e9377e3";i:215;s:8:"b9d88262";i:216;s:8:"352b047b";i:217;s:8:"dc4f433e";i:218;s:8:"d15988d9";i:219;s:8:"b1c20d10";i:220;s:8:"b6304c0a";i:221;s:8:"a603c5a2";i:222;s:8:"e8d4887f";i:223;s:8:"9940ee60";i:224;s:8:"2694af55";i:225;s:8:"b0c57c6d";i:226;s:8:"83b6f8ed";i:227;s:8:"3157a251";i:228;s:8:"035c0640";i:229;s:8:"cde74c75";i:230;s:8:"25e56c27";i:231;s:8:"049e2358";i:232;s:8:"7dc7eeef";i:233;s:8:"cbdcbf63";i:234;s:8:"2fdc1505";i:235;s:8:"7e971290";i:236;s:8:"683364e7";i:237;s:8:"d3f2daa6";i:238;s:8:"e9b7f8ea";i:239;s:8:"4d209cf7";i:240;s:8:"3ced9420";i:241;s:8:"35cb21fe";i:242;s:8:"d6cdfcf0";i:243;s:8:"cfd3017b";i:244;s:8:"d131610c";i:245;s:8:"6fe35b04";i:246;s:8:"ec8af631";i:247;s:8:"13afbe43";i:248;s:8:"7651fdb7";i:249;s:8:"e0af7c59";i:250;s:8:"4eb2f614";i:251;s:8:"f0551e5c";i:252;s:8:"e4e11027";i:253;s:8:"3c49475c";i:254;s:8:"533a2fda";i:255;s:8:"5da738f1";i:256;s:8:"d738123b";i:257;s:8:"4852116e";i:258;s:8:"d8026d36";i:259;s:8:"fb0620e3";i:260;s:8:"6c6ed2a2";i:261;s:8:"b0a75f8c";i:262;s:8:"abde8f63";i:263;s:8:"6f3a4eeb";i:264;s:8:"d9253eb5";i:265;s:8:"e853eaf2";i:266;s:8:"734fdd7d";i:267;s:8:"9b3eb62c";i:268;s:8:"5848a470";i:269;s:8:"f5a8ad9f";i:270;s:8:"ac462717";i:271;s:8:"5e472a83";i:272;s:8:"96f7388e";i:273;s:8:"ff37ceb2";i:274;s:8:"d5e579bb";i:275;s:8:"c8b9198c";i:276;s:8:"54f51120";i:277;s:8:"f3d0ed28";i:278;s:8:"1ab40984";i:279;s:8:"61bd99e2";i:280;s:8:"ca77d771";i:281;s:8:"a274a7c7";i:282;s:8:"fdd90da0";i:283;s:8:"6a4ec634";i:284;s:8:"60fa4084";i:285;s:8:"812bb13f";i:286;s:8:"31bb723e";i:287;s:8:"6db4816d";i:288;s:8:"9ec0563e";i:289;s:8:"9f7a5a69";i:290;s:8:"8a1cd966";i:291;s:8:"9bcc4b77";i:292;s:8:"7686f1a3";i:293;s:8:"91274957";i:294;s:8:"319338ba";i:295;s:8:"93260336";i:296;s:8:"17ab3293";i:297;s:8:"6d1b6c4d";i:298;s:8:"d4404555";i:299;s:8:"c65c9432";i:300;s:8:"e290cda4";i:301;s:8:"64060ca6";i:302;s:8:"2301f229";i:303;s:8:"106a399b";i:304;s:8:"9ce8edd8";i:305;s:8:"f84f5656";i:306;s:8:"8d496aca";i:307;s:8:"91fa72bd";i:308;s:8:"b0194a9a";i:309;s:8:"69908a63";i:310;s:8:"22021e3e";i:311;s:8:"c909f30e";i:312;s:8:"b52a3ac4";i:313;s:8:"7027d0d1";i:314;s:8:"bbe2ce02";i:315;s:8:"99f5034e";i:316;s:8:"1b228e94";i:317;s:8:"43924727";i:318;s:8:"cc2f0619";i:319;s:8:"59283449";i:320;s:8:"f61822f5";i:321;s:8:"ca0c32da";i:322;s:8:"990604c0";i:323;s:8:"5d53048f";i:324;s:8:"47425a59";i:325;s:8:"01c1d1ab";i:326;s:8:"3307c5ed";i:327;s:8:"f8511f69";i:328;s:8:"600111f1";i:329;s:8:"4dee4df9";i:330;s:8:"2074d4e2";i:331;s:8:"1ef830b2";i:332;s:8:"fa559590";i:333;s:8:"7b546ad3";i:334;s:8:"8d3d48e7";i:335;s:8:"61d7a442";i:336;s:8:"5dc50c7d";i:337;s:8:"0e8bc91f";i:338;s:8:"051efd97";i:339;s:8:"367c033c";i:340;s:8:"04abbe75";i:341;s:8:"6b0d06dd";i:342;s:8:"d1e424ed";i:343;s:8:"74a75375";i:344;s:8:"444e9fa5";i:345;s:8:"b18ecfcb";i:346;s:8:"52073b04";i:347;s:8:"875835f6";i:348;s:8:"5b1e47a2";i:349;s:8:"7ac22ffe";i:350;s:8:"b98b3485";i:351;s:8:"001a8666";i:352;s:8:"8359e850";i:353;s:8:"a7786c42";i:354;s:8:"578cb3fb";i:355;s:8:"3fc46089";i:356;s:8:"0f138709";i:357;s:8:"9fb87117";i:358;s:8:"9286b4e3";i:359;s:8:"eb66c9b7";i:360;s:8:"8a951e1a";i:361;s:8:"7b13d471";i:362;s:8:"0322d51d";i:363;s:8:"275f088b";i:364;s:8:"88f897d1";i:365;s:8:"895b0386";i:366;s:8:"9fd03339";i:367;s:8:"e4c3e7f6";i:368;s:8:"181fe744";i:369;s:8:"2b5dfad0";i:370;s:8:"0d31842c";i:371;s:8:"5b2f8c94";i:372;s:8:"872fa16b";i:373;s:8:"5fa89dce";i:374;s:8:"4c834919";i:375;s:8:"134febb0";i:376;s:8:"c61cdc7b";i:377;s:8:"f3e8d824";i:378;s:8:"52cb9f5b";i:379;s:8:"4faf5b5f";i:380;s:8:"ff2d739e";i:381;s:8:"7c08b94a";i:382;s:8:"1cf77bbe";i:383;s:8:"cfb91ddb";i:384;s:8:"aa41d249";i:385;s:8:"8162dacb";i:386;s:8:"a1c8d3bd";i:387;s:8:"44796461";i:388;s:8:"ac578eb2";i:389;s:8:"dfcd7eec";i:390;s:8:"f98a23ad";i:391;s:8:"bb970d9c";i:392;s:8:"1cb9083b";i:393;s:8:"3e6f8065";i:394;s:8:"1ea05560";i:395;s:8:"b8789a3e";i:396;s:8:"515961ed";i:397;s:8:"8f69882e";i:398;s:8:"2fa3991f";i:399;s:8:"7ead2c4e";i:400;s:8:"586a1c3a";i:401;s:8:"a363faff";i:402;s:8:"2efd2522";i:403;s:8:"7162537e";i:404;s:8:"9f43348b";i:405;s:8:"4102a2f0";i:406;s:8:"1f285fdb";i:407;s:8:"6fb569f9";i:408;s:8:"160f9ddf";i:409;s:8:"cbeca768";i:410;s:8:"0a099c23";i:411;s:8:"f1226cd6";i:412;s:8:"d25e894f";i:413;s:8:"20798499";i:414;s:8:"eae4c7cd";i:415;s:8:"252be30e";i:416;s:8:"b55cae46";i:417;s:8:"b559ee05";i:418;s:8:"387b8eeb";i:419;s:8:"452bd851";i:420;s:8:"7c13f032";i:421;s:8:"cca20739";i:422;s:8:"10656673";i:423;s:8:"e30c8c28";i:424;s:8:"c58b24c7";i:425;s:8:"447c1cba";i:426;s:8:"baf4d64d";i:427;s:8:"616e1a03";i:428;s:8:"2350c0ee";i:429;s:8:"d3ca1373";i:430;s:8:"90655ac3";i:431;s:8:"d5d65b87";i:432;s:8:"06f30b84";i:433;s:8:"3a799aa8";i:434;s:8:"7177c769";i:435;s:8:"c41b73f4";i:436;s:8:"db231a35";i:437;s:8:"3daa27f8";i:438;s:8:"2a79242d";i:439;s:8:"e6e83529";i:440;s:8:"acd919cd";i:441;s:8:"ce3c757b";i:442;s:8:"f28ec559";i:443;s:8:"28f150b8";i:444;s:8:"c7f9aa2a";i:445;s:8:"f09ad69c";i:446;s:8:"8ad7b39f";i:447;s:8:"efbc52b7";i:448;s:8:"c7241e29";i:449;s:8:"d9be6cbf";i:450;s:8:"464cc722";i:451;s:8:"5e768901";i:452;s:8:"55e7a5e7";i:453;s:8:"2b867952";i:454;s:8:"38b9eac9";i:455;s:8:"d85a0dde";i:456;s:8:"e65eb255";i:457;s:8:"7483a381";i:458;s:8:"308aa0e0";i:459;s:8:"458c519e";i:460;s:8:"dd28f333";i:461;s:8:"bacf8314";i:462;s:8:"1150d92c";i:463;s:8:"305a9fe1";i:464;s:8:"acea2a32";i:465;s:8:"16713320";i:466;s:8:"71a0a4e0";i:467;s:8:"c7d00243";i:468;s:8:"0ac86aaf";i:469;s:8:"1032f1d2";i:470;s:8:"7377d552";i:471;s:8:"c4de5c81";i:472;s:8:"d9d0b845";i:473;s:8:"ccdda742";i:474;s:8:"53ea255d";i:475;s:8:"e54de4cb";i:476;s:8:"40194771";i:477;s:8:"50705085";i:478;s:8:"37019951";i:479;s:8:"9713232f";i:480;s:8:"acca2ceb";i:481;s:8:"4fbceec4";i:482;s:8:"7ff2d245";i:483;s:8:"141a9636";i:484;s:8:"76f008f4";i:485;s:8:"02aa9ffd";i:486;s:8:"c1658582";i:487;s:8:"3b2b2917";i:488;s:8:"f3b00a34";i:489;s:8:"4df87e3a";i:490;s:8:"a873003c";i:491;s:8:"2671cf2e";i:492;s:8:"463c7db4";i:493;s:8:"ee619867";i:494;s:8:"ace73690";i:495;s:8:"bd327a30";i:496;s:8:"c6986375";i:497;s:8:"b96ce429";i:498;s:8:"abdb31ae";i:499;s:8:"b902a354";i:500;s:8:"3d61edf7";i:501;s:8:"3f73cde8";i:502;s:8:"a547617a";i:503;s:8:"cf2d405c";i:504;s:8:"25fd9b37";i:505;s:8:"712808b5";i:506;s:8:"8603d1f1";i:507;s:8:"7610f13b";i:508;s:8:"574e616a";i:509;s:8:"6c249fbc";i:510;s:8:"7ae46ef3";i:511;s:8:"47dc6040";i:512;s:8:"71bd1063";i:513;s:8:"273c6c6c";i:514;s:8:"a6987e95";i:515;s:8:"78889523";i:516;s:8:"80130af6";i:517;s:8:"8f5b319c";i:518;s:8:"2e812199";i:519;s:8:"4db968c6";i:520;s:8:"6f6da47b";i:521;s:8:"036a8602";i:522;s:8:"ca96fdb4";i:523;s:8:"33223156";i:524;s:8:"ade3394f";i:525;s:8:"f82e1432";i:526;s:8:"bd0ec17e";i:527;s:8:"6dcee788";i:528;s:8:"429d329f";i:529;s:8:"45e032a2";i:530;s:8:"a96eee81";i:531;s:8:"9b3787cd";i:532;s:8:"4fcbf08a";i:533;s:8:"97e3c06f";i:534;s:8:"113ed973";i:535;s:8:"bb551a5a";i:536;s:8:"0a69b24c";i:537;s:8:"3396bf8d";i:538;s:8:"aef4ecf8";i:539;s:8:"be86e2bc";i:540;s:8:"c3d80692";i:541;s:8:"f2c6496a";i:542;s:8:"b36bb42d";i:543;s:8:"9034b911";i:544;s:8:"a4ca2800";i:545;s:8:"9271c0d1";i:546;s:8:"f0cfe562";i:547;s:8:"25bb4f26";i:548;s:8:"2c3243b2";i:549;s:8:"c51aa85c";i:550;s:8:"28a3e684";i:551;s:8:"7a3e304b";i:552;s:8:"fbdbf310";i:553;s:8:"7a621b8b";i:554;s:8:"c812f21d";i:555;s:8:"a230f23a";i:556;s:8:"985f84b5";i:557;s:8:"9be95daa";i:558;s:8:"1f06e91c";i:559;s:8:"54b94f88";i:560;s:8:"87edb009";i:561;s:8:"c896fa5c";i:562;s:8:"6529c4de";i:563;s:8:"b1605fd2";i:564;s:8:"e8926d8e";i:565;s:8:"3f2ecc47";i:566;s:8:"1151f23d";i:567;s:8:"1e8ce42c";i:568;s:8:"775c3531";i:569;s:8:"76009abd";i:570;s:8:"301b6ca0";i:571;s:8:"09d62771";i:572;s:8:"da67f8dd";i:573;s:8:"045cdd31";i:574;s:8:"478c15fe";i:575;s:8:"bbae49ba";i:576;s:8:"25dbb457";i:577;s:8:"18eb4397";i:578;s:8:"9e6aa0af";i:579;s:8:"2581ffc2";i:580;s:8:"8a4df421";i:581;s:8:"1ee97b47";i:582;s:8:"b1ff1326";i:583;s:8:"1642041e";i:584;s:8:"41699d9e";i:585;s:8:"9a3cbb05";i:586;s:8:"a71bac58";i:587;s:8:"4aa84d69";i:588;s:8:"e2f1f243";i:589;s:8:"ea9f1388";i:590;s:8:"0fbdd2a7";i:591;s:8:"f52fe152";i:592;s:8:"4c01c5ba";i:593;s:8:"6f190fe2";i:594;s:8:"e6f03497";i:595;s:8:"61585fcc";i:596;s:8:"eb84148e";i:597;s:8:"5d028f4b";i:598;s:8:"35fb9897";i:599;s:8:"70185114";i:600;s:8:"0da1e3f7";i:601;s:8:"aa66b9b0";i:602;s:8:"66dec731";i:603;s:8:"ebab3bd7";i:604;s:8:"84fdfcbf";i:605;s:8:"a47277df";i:606;s:8:"e5653e1b";i:607;s:8:"585438fa";i:608;s:8:"ba2bcf79";i:609;s:8:"c29e5d18";i:610;s:8:"862eb158";i:611;s:8:"02c2c28b";i:612;s:8:"59a081fd";i:613;s:8:"fcbeb747";i:614;s:8:"79a4d799";i:615;s:8:"f21a6087";i:616;s:8:"bdee779a";i:617;s:8:"d08c6853";i:618;s:8:"cc78676a";i:619;s:8:"621f902f";i:620;s:8:"b077448e";i:621;s:8:"32625d77";i:622;s:8:"9f790bf6";i:623;s:8:"211255a7";i:624;i:0;i:625;i:0;}}', ], diff --git a/api/tests/GameReplay/resources/replay5.php b/api/tests/GameReplay/resources/replay5.php index 10a35b02..1562d80f 100644 --- a/api/tests/GameReplay/resources/replay5.php +++ b/api/tests/GameReplay/resources/replay5.php @@ -134,7 +134,7 @@ ], 'lastEventId' => [ null, - 46 => 62, + 46 => 304, ], 'seed' => [ 3083027478, @@ -195,7 +195,7 @@ 'consolation_prices', 'PierreSaidNoMonsterZone', 'BloodSucker', - 'Play2Hurt', + 'BloodSucker', 'Horsepill', 'BFB', 'Redbloons', @@ -309,8 +309,8 @@ 'healthPoints' => [ 15 => 175, 18 => 125, - 62 => 134, - 64 => -14, + 62 => 120, + 64 => -28, ], 'maxHealthPoints' => [ 15 => 175, @@ -595,31 +595,31 @@ ], 'App\\Game\\State\\GameEvent' => [ 'id' => [ - 21 => 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, + 21 => 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, ], 'type' => [ 21 => \App\Enum\GameEventTypeEnum::CARD_PLAYED, @@ -778,6 +778,60 @@ 'targetId' => 'c8ba83e8-fcde-4d02-b740-568fd1e271a1', ], ], + 'parentId' => [ + 21 => null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + 'localId' => [ + 21 => 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], ], 'App\\Game\\Card\\MonsterCardState' => [ 'currentHealthPoints' => [ diff --git a/makefile b/makefile index 82e432d3..433403e7 100644 --- a/makefile +++ b/makefile @@ -1,11 +1,6 @@ WITH_DOCKER?=1 COMPOSE=$(shell which docker) compose -STACK_NAME=tcg -INFISICAL_DOMAIN=https://infisical-esgi.wiatr.fr -INFISICAL_PROJECT_ID=659c8dc2-1cee-414f-8fd7-70b1ab9b537c -INFISICAL_ENV=production - ifndef env env=dev endif @@ -19,6 +14,9 @@ endif CONSOLE=$(PHP) php bin/console --env=$(env) COVERAGE_DIR=var/phpunit +TEST_REPLAY_FOLDER = api/tests/GameReplay/resources +TEST_REPLAY_FOLDER_REL = $(TEST_REPLAY_FOLDER:api/%=%) + # ===== Dev ===== up: @@ -125,3 +123,17 @@ symfony-lint: stan: $(PHP) vendor/bin/mago analyze + +regenerate-tests-replay: + @for file in $(TEST_REPLAY_FOLDER)/*.php; do \ + name=$$(basename "$$file" .php); \ + echo "Regenerating $$name..."; \ + id=$$( ( $(CONSOLE) app:import:game-replay $(TEST_REPLAY_FOLDER_REL)/$$name.php ) | tail -n1 | tr -d '\r' ); \ + output=$$( ( $(CONSOLE) app:export:game-replay $$id --test ) 2>&1 ); \ + if [ $$? -ne 0 ]; then \ + reason=$$(echo "$$output" | grep -m1 -oE '[A-Za-z0-9 "._-]+ not found' || echo 'export failed'); \ + echo " skip $$name: $$reason"; \ + continue; \ + fi; \ + mv $(TEST_REPLAY_FOLDER)/replay-$$id.php $$file; \ + done