From da080fe3f6f6dceb7763a6fd76ca8e36e92b8021 Mon Sep 17 00:00:00 2001 From: Sylvain Pollet-Villard Date: Sat, 5 Oct 2024 09:32:43 +0200 Subject: [PATCH] add free shop rolls and new unown-R (#2282) --- app/core/abilities/hidden-power.ts | 44 ++----------------- app/models/colyseus-models/player.ts | 1 + app/models/shop.ts | 13 +++--- app/public/dist/client/changelog/patch-5.6.md | 2 + .../dist/client/locales/bg/translation.json | 4 +- .../dist/client/locales/de/translation.json | 4 +- .../dist/client/locales/en/translation.json | 8 ++-- .../dist/client/locales/es/translation.json | 4 +- .../dist/client/locales/fr/translation.json | 4 +- .../dist/client/locales/it/translation.json | 4 +- .../dist/client/locales/ja/translation.json | 4 +- .../dist/client/locales/ko/translation.json | 4 +- .../dist/client/locales/nl/translation.json | 4 +- .../dist/client/locales/pl/translation.json | 2 +- .../dist/client/locales/pt/translation.json | 4 +- .../dist/client/locales/th/translation.json | 2 +- .../dist/client/locales/vi/translation.json | 4 +- .../src/game/components/unown-manager.ts | 2 +- .../src/pages/component/game/game-refresh.tsx | 8 +++- .../src/pages/component/game/game-shop.css | 23 +++++----- app/public/src/pages/game.tsx | 5 +++ app/public/src/stores/GameStore.ts | 6 +++ app/rooms/commands/game-commands.ts | 40 ++++++++++------- app/types/index.ts | 1 + 24 files changed, 91 insertions(+), 106 deletions(-) diff --git a/app/core/abilities/hidden-power.ts b/app/core/abilities/hidden-power.ts index fa1fe9ce27..7f97e200c0 100644 --- a/app/core/abilities/hidden-power.ts +++ b/app/core/abilities/hidden-power.ts @@ -425,47 +425,9 @@ export class HiddenPowerRStrategy extends HiddenPowerStrategy { crit: boolean ) { super.process(unown, state, board, target, crit) - let coord = unown.simulation.getClosestAvailablePlaceOnBoardToPokemon( - unown, - unown.team - ) - const geodude = unown.simulation.addPokemon( - PokemonFactory.createPokemonFromName(Pkm.GEODUDE, unown.player), - coord.x, - coord.y, - unown.team, - false - ) - geodude.items.add(Item.ROCKY_HELMET) - geodude.simulation.applyItemsEffects(geodude) - - coord = unown.simulation.getClosestAvailablePlaceOnBoardToPokemon( - unown, - unown.team - ) - const graveler = unown.simulation.addPokemon( - PokemonFactory.createPokemonFromName(Pkm.GRAVELER, unown.player), - coord.x, - coord.y, - unown.team, - false - ) - graveler.items.add(Item.ROCKY_HELMET) - graveler.simulation.applyItemsEffects(graveler) - - coord = unown.simulation.getClosestAvailablePlaceOnBoardToPokemon( - unown, - unown.team - ) - const golem = unown.simulation.addPokemon( - PokemonFactory.createPokemonFromName(Pkm.GOLEM, unown.player), - coord.x, - coord.y, - unown.team, - false - ) - golem.items.add(Item.ROCKY_HELMET) - golem.simulation.applyItemsEffects(golem) + if (unown.player) { + unown.player.shopFreeRolls += 6 + } } } diff --git a/app/models/colyseus-models/player.ts b/app/models/colyseus-models/player.ts index f9e9665ddb..19e500a735 100644 --- a/app/models/colyseus-models/player.ts +++ b/app/models/colyseus-models/player.ts @@ -53,6 +53,7 @@ export default class Player extends Schema implements IPlayer { @type("uint16") money = process.env.MODE == "dev" ? 999 : 5 @type("int8") life = 100 @type("boolean") shopLocked: boolean = false + @type("uint8") shopFreeRolls: number = 0 @type("uint8") streak: number = 0 @type("uint8") interest: number = 0 @type("string") opponentId: string = "" diff --git a/app/models/shop.ts b/app/models/shop.ts index 7e1ce8eeb5..b337358269 100644 --- a/app/models/shop.ts +++ b/app/models/shop.ts @@ -276,16 +276,11 @@ export default class Shop { refillShop(player: Player, state: GameState) { // No need to release pokemons since they won't be changed - const PkmList = player.shop.map((pokemon, i) => { - if (pokemon != Pkm.MAGIKARP && pokemon != Pkm.DEFAULT) { - return pokemon + player.shop.forEach((pokemon, i) => { + if (pokemon === Pkm.MAGIKARP || pokemon === Pkm.DEFAULT) { + player.shop[i] = this.pickPokemon(player, state, i) } - return this.pickPokemon(player, state, i) }) - - for (let i = 0; i < SHOP_SIZE; i++) { - player.shop[i] = PkmList[i] - } } assignShop(player: Player, manualRefresh: boolean, state: GameState) { @@ -296,6 +291,8 @@ export default class Shop { !manualRefresh && !player.shopLocked ) { + // Unown shop + player.shopFreeRolls += 1 const unowns = getUnownsPoolPerStage(state.stageLevel) for (let i = 0; i < SHOP_SIZE; i++) { player.shop[i] = pickRandomIn(unowns) diff --git a/app/public/dist/client/changelog/patch-5.6.md b/app/public/dist/client/changelog/patch-5.6.md index dfb66d6ec4..31995de8c0 100644 --- a/app/public/dist/client/changelog/patch-5.6.md +++ b/app/public/dist/client/changelog/patch-5.6.md @@ -54,12 +54,14 @@ - Buff Fearow: Def/SpeDef: 1/1 → 2/2 ; buff Peck: 10/20/30 → 10/30/50 damage - Buff Unown-A: PP 100 → 90, Unown-D: PP 150 → 100, Unown-J: PP 100 → 90, Unown-K: PP 100 → 90, Unown-L: PP 100 → 60, Unown-O: PP 100 → 50, Unown-R: PP 100 → 90, Unown-V: PP 100 → 90, Unown-X: PP 100 → 60, Unown-Z: PP 100 → 90, Unown-!: PP 100 → 60 - Change Unown-N: team gains 50 shield and cast Explosion +- Change Unown-R: ROLL: gives 6 free shop rerolls # Changes to Synergies - Nerf Fighting 8: damage blocked 15 → 13 - Buff Ice 8: frozen enemies now take 20% additional damage - Baby 3 egg chance now increase with loss streaks only when baby synergy is active, and resets to zero once an egg is obtained. Same for shiny egg chance at Baby 7. Removed max limit for eggs on bench. +- Unown Shop of Psychic 6 can now be skipped by rerolling shop for free # Changes to Items diff --git a/app/public/dist/client/locales/bg/translation.json b/app/public/dist/client/locales/bg/translation.json index cf25c3e489..de65a5bc2f 100644 --- a/app/public/dist/client/locales/bg/translation.json +++ b/app/public/dist/client/locales/bg/translation.json @@ -199,7 +199,7 @@ "HIDDEN_POWER_O": "Скрита сила (ORAN)", "HIDDEN_POWER_P": "Скрита сила (PEST)", "HIDDEN_POWER_Q": "Скрита сила (QUIT)", - "HIDDEN_POWER_R": "Скрита сила (ROCK)", + "HIDDEN_POWER_R": "Скрита сила (ROLL)", "HIDDEN_POWER_S": "Скрита сила (STOP)", "HIDDEN_POWER_T": "Скрита сила (TREE)", "HIDDEN_POWER_U": "Скрита сила (UXIE)", @@ -1007,7 +1007,7 @@ "HIDDEN_POWER_O": "Дайте Оран Бери на целия си екип. Елементът се премахва в края на битката.", "HIDDEN_POWER_P": "Създайте 5 произволни BUG STAR покемона", "HIDDEN_POWER_Q": "Веднага завършва битката с равенство", - "HIDDEN_POWER_R": "Породете Geodude, Graveler и Golem със скалисти шлемове", + "HIDDEN_POWER_R": "Вземете 6 безплатни превъртания в магазина", "HIDDEN_POWER_S": "FREEZE противниковия отбор за 4 секунди", "HIDDEN_POWER_T": "Вземете 3 произволни горски плодове", "HIDDEN_POWER_U": "Зародете Uxie с Aqua Egg и максимум PP", diff --git a/app/public/dist/client/locales/de/translation.json b/app/public/dist/client/locales/de/translation.json index bb8c3c8c4d..1725249841 100644 --- a/app/public/dist/client/locales/de/translation.json +++ b/app/public/dist/client/locales/de/translation.json @@ -216,7 +216,7 @@ "HIDDEN_POWER_O": "Kraftreserve (ORAN)", "HIDDEN_POWER_P": "Kraftreserve (PEST)", "HIDDEN_POWER_Q": "Kraftreserve (QUIT)", - "HIDDEN_POWER_R": "Kraftreserve (ROCK)", + "HIDDEN_POWER_R": "Kraftreserve (ROLL)", "HIDDEN_POWER_S": "Kraftreserve (STOP)", "HIDDEN_POWER_T": "Kraftreserve (TREE)", "HIDDEN_POWER_U": "Kraftreserve (UXIE)", @@ -1394,7 +1394,7 @@ "HIDDEN_POWER_O": "Geben Sie Ihrem gesamten Team ORAN_BERRY. Der Gegenstand wird am Ende des Kampfes entfernt.", "HIDDEN_POWER_P": "Bringe 5 zufällige BUG STAR Pokémon", "HIDDEN_POWER_Q": "Beendet den Kampf sofort mit einem Unentschieden", - "HIDDEN_POWER_R": "Spawne Kleinstein, Georok und Geowaz mit Beulenhelm", + "HIDDEN_POWER_R": "Erhalte 6 kostenlose Shop-Rerolls", "HIDDEN_POWER_S": "FREEZE das gegnerische Team für 4 Sekunden ein", "HIDDEN_POWER_T": "Erhalte 3 zufällige Beeren", "HIDDEN_POWER_U": "Bringe Selfe mit Manaphy-Ei und maximalem PP hervor", diff --git a/app/public/dist/client/locales/en/translation.json b/app/public/dist/client/locales/en/translation.json index 49ae38a64f..e95818c045 100644 --- a/app/public/dist/client/locales/en/translation.json +++ b/app/public/dist/client/locales/en/translation.json @@ -221,7 +221,7 @@ "HIDDEN_POWER_O": "Hidden Power (ORAN)", "HIDDEN_POWER_P": "Hidden Power (PEST)", "HIDDEN_POWER_Q": "Hidden Power (QUIT)", - "HIDDEN_POWER_R": "Hidden Power (ROCK)", + "HIDDEN_POWER_R": "Hidden Power (ROLL)", "HIDDEN_POWER_S": "Hidden Power (STOP)", "HIDDEN_POWER_T": "Hidden Power (TREE)", "HIDDEN_POWER_U": "Hidden Power (UXIE)", @@ -1450,7 +1450,7 @@ "HIDDEN_POWER_O": "Give ORAN_BERRY to your whole team. The item is removed at the end of the fight.", "HIDDEN_POWER_P": "Spawn 5 random STAR BUG Pokémons", "HIDDEN_POWER_Q": "Immediately ends the fight with a draw", - "HIDDEN_POWER_R": "Spawn Geodude, Graveler and Golem with Rocky Helmets", + "HIDDEN_POWER_R": "Get 6 free shop rerolls", "HIDDEN_POWER_S": "FREEZE the opponent team for 4 seconds", "HIDDEN_POWER_T": "Get 3 random berries", "HIDDEN_POWER_U": "Spawn Uxie with AQUA_EGG and max PP", @@ -2805,7 +2805,7 @@ "rate": "Rate", "increase_level_hint": "Increase your level to raise your chances to get higher tier Pokémon.", "refresh_gold_hint": "Refresh shop for 1 gold", - "refresh": "Refresh", + "refresh": "Reroll", "pve_stages": "PVE Stages", "carousel_stages": "Carousel Stages", "additional_picks": "Additional picks", @@ -2968,7 +2968,7 @@ "action": "Action", "key_desc_sell": "Sell hovered Pokémon", "key_desc_buy_xp": "Buy experience", - "key_desc_refresh": "Refresh shop", + "key_desc_refresh": "Reroll shop", "key_desc_avatar_anim": "Play avatar animation", "key_desc_avatar_emotes": "Toggle emote menu", "key_desc_avatar_show_emote": "Trigger emote", diff --git a/app/public/dist/client/locales/es/translation.json b/app/public/dist/client/locales/es/translation.json index 1976be5a5c..ab6b260e12 100644 --- a/app/public/dist/client/locales/es/translation.json +++ b/app/public/dist/client/locales/es/translation.json @@ -219,7 +219,7 @@ "HIDDEN_POWER_O": "Poder Oculto (ORAN)", "HIDDEN_POWER_P": "Poder Oculto (PEST)", "HIDDEN_POWER_Q": "Poder Oculto (QUIT)", - "HIDDEN_POWER_R": "Poder Oculto (ROCK)", + "HIDDEN_POWER_R": "Poder Oculto (ROLL)", "HIDDEN_POWER_S": "Poder Oculto (STOP)", "HIDDEN_POWER_T": "Poder Oculto (TREE)", "HIDDEN_POWER_U": "Poder Oculto (UXIE)", @@ -1411,7 +1411,7 @@ "HIDDEN_POWER_O": "Otorga ORAN_BERRY a todo tu equipo. El elemento se elimina al final de la pelea.", "HIDDEN_POWER_P": "Invoca 5 Pokémon BUG STAR aleatorios", "HIDDEN_POWER_Q": "Inmediatamente termina la pelea con un empate.", - "HIDDEN_POWER_R": "Invoca Geodude, Graveler y Golem con Rocky Helmets", + "HIDDEN_POWER_R": "Obtén 6 rerolls de tienda gratis", "HIDDEN_POWER_S": "Deja FREEZE al equipo oponente durante 4 segundos", "HIDDEN_POWER_T": "Consigue 3 bayas al azar", "HIDDEN_POWER_U": "Invoca Uxie con Aqua Egg y max PP", diff --git a/app/public/dist/client/locales/fr/translation.json b/app/public/dist/client/locales/fr/translation.json index 1546ee8da3..0a451aa49a 100644 --- a/app/public/dist/client/locales/fr/translation.json +++ b/app/public/dist/client/locales/fr/translation.json @@ -218,7 +218,7 @@ "HIDDEN_POWER_O": "Puissance Cachée (ORAN)", "HIDDEN_POWER_P": "Puissance Cachée (PEST)", "HIDDEN_POWER_Q": "Puissance Cachée (QUIT)", - "HIDDEN_POWER_R": "Puissance Cachée (ROCK)", + "HIDDEN_POWER_R": "Puissance Cachée (ROLL)", "HIDDEN_POWER_S": "Puissance Cachée (STOP)", "HIDDEN_POWER_T": "Puissance Cachée (TREE)", "HIDDEN_POWER_U": "Puissance Cachée (UXIE)", @@ -1387,7 +1387,7 @@ "HIDDEN_POWER_O": "Donne une Baie Oran à toute votre équipe. Les objets sont retirés à la fin du combat.", "HIDDEN_POWER_P": "Invoque 5 pokémons BUG STAR aléatoires", "HIDDEN_POWER_Q": "Termine immédiatement le combat par un match nul", - "HIDDEN_POWER_R": "Invoque un Racaillou, Gravalanch et Golem des casques Brut", + "HIDDEN_POWER_R": "Gagnez 6 relances de boutique gratuites", "HIDDEN_POWER_S": "FREEZE l'équipe adverse pendant 4 secondes", "HIDDEN_POWER_T": "Gagnez 3 baies aléatoires", "HIDDEN_POWER_U": "Invoque $t(pkm.UXIE) avec un AQUA_EGG et PP au max", diff --git a/app/public/dist/client/locales/it/translation.json b/app/public/dist/client/locales/it/translation.json index f3fea77721..4e399d2c3e 100644 --- a/app/public/dist/client/locales/it/translation.json +++ b/app/public/dist/client/locales/it/translation.json @@ -221,7 +221,7 @@ "HIDDEN_POWER_O": "Introforza (ORAN)", "HIDDEN_POWER_P": "Introforza (PEST)", "HIDDEN_POWER_Q": "Introforza (QUIT)", - "HIDDEN_POWER_R": "Introforza (ROCK)", + "HIDDEN_POWER_R": "Introforza (ROLL)", "HIDDEN_POWER_S": "Introforza (STOP)", "HIDDEN_POWER_T": "Introforza (TREE)", "HIDDEN_POWER_U": "Introforza (UXIE)", @@ -1450,7 +1450,7 @@ "HIDDEN_POWER_O": "Equipaggia una ORAN_BERRY a tutta la tua squadra. L'oggetto viene rimosso alla fine del combattimento.", "HIDDEN_POWER_P": "Evoca 5 Pokèmon STAR BUG casuali.", "HIDDEN_POWER_Q": "Termina immediatamente il combattimento con un pareggio", - "HIDDEN_POWER_R": "Evoca Geodude, Graveler e Golem con equipaggiato Bitorzoelmo", + "HIDDEN_POWER_R": "Ottieni 6 reroll gratuiti per il negozio", "HIDDEN_POWER_S": "Provoca FREEZE a tutta la squadra avversaria per 4 secondi.", "HIDDEN_POWER_T": "Ricevi 3 bacche casuali", "HIDDEN_POWER_U": "Evoca Uxie con equipaggiato un AQUA_EGG e i PP al massimo.", diff --git a/app/public/dist/client/locales/ja/translation.json b/app/public/dist/client/locales/ja/translation.json index 33fab2accd..5c6db6f298 100644 --- a/app/public/dist/client/locales/ja/translation.json +++ b/app/public/dist/client/locales/ja/translation.json @@ -199,7 +199,7 @@ "HIDDEN_POWER_O": "秘められた力 (ORAN)", "HIDDEN_POWER_P": "隠された力 (PEST)", "HIDDEN_POWER_Q": "秘められた力 (QUIT)", - "HIDDEN_POWER_R": "秘められた力 (ROCK)", + "HIDDEN_POWER_R": "秘められた力 (ROLL)", "HIDDEN_POWER_S": "秘められた力 (STOP)", "HIDDEN_POWER_T": "秘められた力 (TREE)", "HIDDEN_POWER_U": "秘められた力 (UXIE)", @@ -992,7 +992,7 @@ "HIDDEN_POWER_O": "オランベリーをチーム全員に与えましょう。アイテムは戦闘終了時に削除されます。", "HIDDEN_POWER_P": "ランダムな BUG STAR ポケモンを 5 匹出現させる", "HIDDEN_POWER_Q": "引き分けですぐに試合を終了する", - "HIDDEN_POWER_R": "ジオデュード、グラベルラー、ゴーレムをロッキーヘルメットでスポーン", + "HIDDEN_POWER_R": "ショップの再ロールを6回無料でゲット", "HIDDEN_POWER_S": "相手チームを4秒間フリーズさせる", "HIDDEN_POWER_T": "ランダムでベリーを3個入手", "HIDDEN_POWER_U": "アクアエッグと最大MANAでユクシーを生成する", diff --git a/app/public/dist/client/locales/ko/translation.json b/app/public/dist/client/locales/ko/translation.json index bcffdbeef0..e09f084f99 100644 --- a/app/public/dist/client/locales/ko/translation.json +++ b/app/public/dist/client/locales/ko/translation.json @@ -220,7 +220,7 @@ "HIDDEN_POWER_O": "잠재파워(오랭열매)", "HIDDEN_POWER_P": "잠재파워(해충)", "HIDDEN_POWER_Q": "잠재파워(중단)", - "HIDDEN_POWER_R": "잠재파워(돌)", + "HIDDEN_POWER_R": "잠재파워(연타)", "HIDDEN_POWER_S": "잠재파워(얼음땡)", "HIDDEN_POWER_T": "잠재파워(풍년)", "HIDDEN_POWER_U": "잠재파워(유크시)", @@ -1436,7 +1436,7 @@ "HIDDEN_POWER_O": "팀 구성원 전체가 ORAN_BERRY 를 획득한다. 이 아이템은 전투후 제거된다.", "HIDDEN_POWER_P": "5마리의 무작위 STAR BUG 포켓몬을 생성한다.", "HIDDEN_POWER_Q": "전투를 무승부로 즉시 끝낸다.", - "HIDDEN_POWER_R": "울퉁불퉁멧을 지닌 꼬마돌, 데구리, 딱구리를 생성한다.", + "HIDDEN_POWER_R": "무료 매장 리롤 6회 받기.", "HIDDEN_POWER_S": "상대팀을 4초간 얼음상태로 만든다.", "HIDDEN_POWER_T": "무작위 열매 3개를 얻는다.", "HIDDEN_POWER_U": "AQUA_EGG 를 지닌 유크시가 PP 가 가득 체워진 상태로 생성된다. ", diff --git a/app/public/dist/client/locales/nl/translation.json b/app/public/dist/client/locales/nl/translation.json index 94049f426c..d0e8262a45 100644 --- a/app/public/dist/client/locales/nl/translation.json +++ b/app/public/dist/client/locales/nl/translation.json @@ -199,7 +199,7 @@ "HIDDEN_POWER_O": "Verborgen Kracht (ORAN)", "HIDDEN_POWER_P": "Verborgen Kracht (PEST)", "HIDDEN_POWER_Q": "Verborgen Kracht (QUIT)", - "HIDDEN_POWER_R": "Verborgen Kracht (ROCK)", + "HIDDEN_POWER_R": "Verborgen Kracht (ROLL)", "HIDDEN_POWER_S": "Verborgen Kracht (STOP)", "HIDDEN_POWER_T": "Verborgen Kracht (TREE)", "HIDDEN_POWER_U": "Verborgen Kracht (UXIE)", @@ -991,7 +991,7 @@ "HIDDEN_POWER_O": "Geef Oran Berry aan je hele team. Het item wordt aan het einde van het gevecht verwijderd.", "HIDDEN_POWER_P": "Spawn 5 willekeurige BUG STAR pokemon", "HIDDEN_POWER_Q": "Beëindigt het gevecht onmiddellijk met een gelijkspel", - "HIDDEN_POWER_R": "Spawn Geodude, Graveler en Golem met Rocky-helmen", + "HIDDEN_POWER_R": "Ontvang 6 gratis winkelherhalingen", "HIDDEN_POWER_S": "FREEZE het team van de tegenstander gedurende 4 seconden", "HIDDEN_POWER_T": "Verkrijg 3 willekeurige bessen", "HIDDEN_POWER_U": "Spawn Uxie met Aqua Egg en max PP", diff --git a/app/public/dist/client/locales/pl/translation.json b/app/public/dist/client/locales/pl/translation.json index c33081e0cf..a9150185a7 100644 --- a/app/public/dist/client/locales/pl/translation.json +++ b/app/public/dist/client/locales/pl/translation.json @@ -206,7 +206,7 @@ "HIDDEN_POWER_O": "Ukryta moc (ORAN)", "HIDDEN_POWER_P": "Ukryta moc (PEST)", "HIDDEN_POWER_Q": "Ukryta moc (QUIT)", - "HIDDEN_POWER_R": "Ukryta moc (ROCK)", + "HIDDEN_POWER_R": "Ukryta moc (ROLL)", "HIDDEN_POWER_S": "Ukryta moc (STOP)", "HIDDEN_POWER_T": "Ukryta moc (TREE)", "HIDDEN_POWER_U": "Ukryta moc (UXIE)", diff --git a/app/public/dist/client/locales/pt/translation.json b/app/public/dist/client/locales/pt/translation.json index de73819621..cc42d20297 100644 --- a/app/public/dist/client/locales/pt/translation.json +++ b/app/public/dist/client/locales/pt/translation.json @@ -216,7 +216,7 @@ "HIDDEN_POWER_O": "Poder Oculto (ORAN)", "HIDDEN_POWER_P": "Poder Oculto (PEST)", "HIDDEN_POWER_Q": "Poder Oculto (SAIR)", - "HIDDEN_POWER_R": "Poder Oculto (ROCHA)", + "HIDDEN_POWER_R": "Poder Oculto (ROLL)", "HIDDEN_POWER_S": "Poder Oculto (PARAR)", "HIDDEN_POWER_T": "Poder Oculto (TREE)", "HIDDEN_POWER_U": "Poder Oculto (UXIE)", @@ -1343,7 +1343,7 @@ "HIDDEN_POWER_O": "Dê Oran Berry para toda a sua equipe. O item é removido no final da luta.", "HIDDEN_POWER_P": "Gere 5 pokémons BUG STAR aleatórios", "HIDDEN_POWER_Q": "Termina imediatamente a luta com um empate", - "HIDDEN_POWER_R": "Gere Geodude, Graveler e Golem com Rocky Helmets", + "HIDDEN_POWER_R": "Ganhe 6 rerolls de loja grátis", "HIDDEN_POWER_S": "FREEZE a equipe adversária por 4 segundos", "HIDDEN_POWER_T": "Obtenha 3 frutas aleatórias", "HIDDEN_POWER_U": "Spawn Uxie com Aqua Egg e max PP", diff --git a/app/public/dist/client/locales/th/translation.json b/app/public/dist/client/locales/th/translation.json index f96953f93a..a366580f84 100644 --- a/app/public/dist/client/locales/th/translation.json +++ b/app/public/dist/client/locales/th/translation.json @@ -219,7 +219,7 @@ "HIDDEN_POWER_O": "มอบ ORAN_BERRY ให้แก่โปเกมอนทุกตัวในทีมของคุณ. ไอเทมที่เพิ่มเข้ามาจะถูกลบออกเมื่อจบรอบ.", "HIDDEN_POWER_P": "เรียกโปเกมอนประเภท BUG ระดับ STAR ออกมา 5 ตัวแบบสุ่ม", "HIDDEN_POWER_Q": "จบการต่อสู้รอบนั้นทันทีด้วยผลเสมอ", - "HIDDEN_POWER_R": "เรียก Geodude, Graveler และ Golem โดยสวมใส่ Rocky Helmets", + "HIDDEN_POWER_R": "รับฟรีรีโรลร้านค้า 6 ครั้ง", "HIDDEN_POWER_S": "ทำให้ศัตรูทุกตัวติดสถานะ FREEZE เป็นเวลา 4 วินาที", "HIDDEN_POWER_T": "ได้รับเบอร์รี่ 3 อันแบบสุ่ม", "HIDDEN_POWER_U": "เรียก Uxie โดยสวมใส่ AQUA_EGG พร้อม PP เต็ม", diff --git a/app/public/dist/client/locales/vi/translation.json b/app/public/dist/client/locales/vi/translation.json index bfe46d71ee..a61e504ad8 100644 --- a/app/public/dist/client/locales/vi/translation.json +++ b/app/public/dist/client/locales/vi/translation.json @@ -216,7 +216,7 @@ "HIDDEN_POWER_O": "Sức Mạnh Tiềm Ẩn (ORAN)", "HIDDEN_POWER_P": "Sức Mạnh Tiềm Ẩn (PEST)", "HIDDEN_POWER_Q": "Sức Mạnh Tiềm Ẩn (QUIT)", - "HIDDEN_POWER_R": "Sức Mạnh Tiềm Ẩn (ROCK)", + "HIDDEN_POWER_R": "Sức Mạnh Tiềm Ẩn (ROLL)", "HIDDEN_POWER_S": "Sức Mạnh Tiềm Ẩn (STOP)", "HIDDEN_POWER_T": "Sức Mạnh Tiềm Ẩn (TREE)", "HIDDEN_POWER_U": "Sức Mạnh Tiềm Ẩn (UXIE)", @@ -1381,7 +1381,7 @@ "HIDDEN_POWER_O": "Tất cả đồng minh được cho ăn ORAN_BERRY. Vật phẩm này sẽ mất đi vào cuối trận đấu", "HIDDEN_POWER_P": "Tạo ra 5 con STAR BUG Pokémon ngẫu nhiên", "HIDDEN_POWER_Q": "Ngay lập tức kết thúc trận đấu với một trận hòa", - "HIDDEN_POWER_R": "Tạo ra Geodude, Graveler và Golem với Rocky Helmets", + "HIDDEN_POWER_R": "Nhận 6 lần đổi cửa hàng miễn phí", "HIDDEN_POWER_S": "FREEZE tất cả đối thủ trong 4 giây", "HIDDEN_POWER_T": "Nhận được 3 quả berry ngẫu nhiên" }, diff --git a/app/public/src/game/components/unown-manager.ts b/app/public/src/game/components/unown-manager.ts index 659722f1f6..2e090d1541 100644 --- a/app/public/src/game/components/unown-manager.ts +++ b/app/public/src/game/components/unown-manager.ts @@ -156,7 +156,7 @@ export const UNOWNS_PER_ABILITY = new Map([ ], [ Ability.HIDDEN_POWER_R, - [Pkm.UNOWN_R, Pkm.UNOWN_O, Pkm.UNOWN_C, Pkm.UNOWN_K] + [Pkm.UNOWN_R, Pkm.UNOWN_O, Pkm.UNOWN_L, Pkm.UNOWN_L] ], [ Ability.HIDDEN_POWER_S, diff --git a/app/public/src/pages/component/game/game-refresh.tsx b/app/public/src/pages/component/game/game-refresh.tsx index ec39907c15..b111714f2f 100644 --- a/app/public/src/pages/component/game/game-refresh.tsx +++ b/app/public/src/pages/component/game/game-refresh.tsx @@ -1,20 +1,24 @@ import React from "react" import { useTranslation } from "react-i18next" +import { useAppSelector } from "../../../hooks" import { getGameScene } from "../../game" +import { cc } from "../../utils/jsx" import { Money } from "../icons/money" export default function GameRefresh() { const { t } = useTranslation() + const shopFreeRolls = useAppSelector((state) => state.game.shopFreeRolls) + const cost = shopFreeRolls > 0 ? 0 : 1 return ( ) } diff --git a/app/public/src/pages/component/game/game-shop.css b/app/public/src/pages/component/game/game-shop.css index 8eaef3d5b9..c33aec6222 100644 --- a/app/public/src/pages/component/game/game-shop.css +++ b/app/public/src/pages/component/game/game-shop.css @@ -18,7 +18,7 @@ } .game-rarity-percentage.my-box { - grid-column: 1/3; + grid-column: 1 / 3; display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; @@ -47,6 +47,7 @@ white-space: nowrap; padding: 0.25em 0.5em; min-height: 2.5em; + position: relative; } .game-shop-actions .refresh-button > img:first-child { @@ -121,8 +122,8 @@ .game-additional-pokemons .grid > p, .game-regional-pokemons .grid > p { - grid-row: 1/5; - grid-column: 1/7; + grid-row: 1 / 5; + grid-column: 1 / 7; display: grid; place-content: center; padding: 1em; @@ -166,7 +167,7 @@ } .game-experience .progress-bar { - grid-column: 1/3; + grid-column: 1 / 3; position: relative; background: transparent; height: 2em; @@ -257,7 +258,7 @@ height: 1em; } -@media (aspect-ratio < 4/3) { +@media (aspect-ratio < 4 / 3) { .game-shop.my-container { flex-wrap: wrap; } @@ -270,7 +271,7 @@ } .game-rarity-percentage.my-box { - grid-column: 1/2; + grid-column: 1 / 2; } .game-pokemons-store { @@ -290,12 +291,12 @@ } .game-experience .progress-bar { - grid-column: 2/3; + grid-column: 2 / 3; grid-row: 1 / 1; } .game-experience .buy-xp-button { - grid-column: 3/4; + grid-column: 3 / 4; grid-row: 1 / 1; } @@ -310,7 +311,7 @@ } } -@media(aspect-ratio > 4/3) and (width <= 1280px) { +@media (aspect-ratio > 4 / 3) and (width <= 1280px) { #game-wrapper .game-shop { transform: scale(0.8); transform-origin: bottom left; @@ -318,8 +319,8 @@ } } -@media(aspect-ratio > 4/3){ +@media (aspect-ratio > 4 / 3) { #game-wrapper .game-shop { max-height: 20vh; } -} \ No newline at end of file +} diff --git a/app/public/src/pages/game.tsx b/app/public/src/pages/game.tsx index ac415a5197..2882b1f4c3 100644 --- a/app/public/src/pages/game.tsx +++ b/app/public/src/pages/game.tsx @@ -54,6 +54,7 @@ import { setPokemonProposition, setRoundTime, setShop, + setShopFreeRolls, setShopLocked, setStageLevel, setStreak, @@ -551,6 +552,7 @@ export default function Game() { dispatch(setInterest(player.interest)) dispatch(setStreak(player.streak)) dispatch(setShopLocked(player.shopLocked)) + dispatch(setShopFreeRolls(player.shopFreeRolls)) dispatch(setPokemonCollection(player.pokemonCollection)) player.listen("interest", (value) => { @@ -562,6 +564,9 @@ export default function Game() { player.listen("shopLocked", (value) => { dispatch(setShopLocked(value)) }) + player.listen("shopFreeRolls", (value) => { + dispatch(setShopFreeRolls(value)) + }) player.listen("money", (value) => { dispatch(setMoney(value)) }) diff --git a/app/public/src/stores/GameStore.ts b/app/public/src/stores/GameStore.ts index 5c18c2045a..4445b3bd77 100644 --- a/app/public/src/stores/GameStore.ts +++ b/app/public/src/stores/GameStore.ts @@ -29,6 +29,7 @@ export interface GameStateStore { money: number interest: number streak: number + shopFreeRolls: number shopLocked: boolean experienceManager: IExperienceManager shop: Pkm[] @@ -58,6 +59,7 @@ const initialState: GameStateStore = { money: 5, interest: 0, streak: 0, + shopFreeRolls: 0, shopLocked: false, experienceManager: new ExperienceManager(), shop: new Array(), @@ -108,6 +110,9 @@ export const gameSlice = createSlice({ setShopLocked: (state, action: PayloadAction) => { state.shopLocked = action.payload }, + setShopFreeRolls: (state, action: PayloadAction) => { + state.shopFreeRolls = action.payload + }, updateExperienceManager: ( state, action: PayloadAction @@ -284,6 +289,7 @@ export const { setStreak, setInterest, setMoney, + setShopFreeRolls, setShopLocked, changePlayer, setShop, diff --git a/app/rooms/commands/game-commands.ts b/app/rooms/commands/game-commands.ts index 74d13b6cab..72779b90d1 100644 --- a/app/rooms/commands/game-commands.ts +++ b/app/rooms/commands/game-commands.ts @@ -126,11 +126,11 @@ export class OnShopCommand extends Command< if ( pokemon.passive === Passive.UNOWN && - player.effects.has(Effect.EERIE_SPELL) && player.shop.every((p) => Unowns.includes(p)) ) { // reset shop after picking in a unown shop this.state.shop.assignShop(player, true, this.state) + player.shopFreeRolls -= 1 } else { player.shop = player.shop.with(index, Pkm.DEFAULT) } @@ -640,10 +640,13 @@ export class OnSellDropCommand extends Command< export class OnRefreshCommand extends Command { execute(id) { const player = this.state.players.get(id) - if (player && player.money >= 1 && player.alive) { + if (!player) return + const rollCost = player.shopFreeRolls > 0 ? 0 : 1 + if (player.money >= rollCost && player.alive) { this.state.shop.assignShop(player, true, this.state) - player.money -= 1 + player.money -= rollCost player.rerollCount++ + if (player.shopFreeRolls > 0) player.shopFreeRolls-- } } } @@ -1262,15 +1265,6 @@ export class OnUpdatePhaseCommand extends Command { player.eggChance = 0 } - if (!player.isBot) { - if (!player.shopLocked) { - this.state.shop.assignShop(player, false, this.state) - } else { - this.state.shop.refillShop(player, this.state) - player.shopLocked = false - } - } - player.board.forEach((pokemon, key) => { if (pokemon.evolutionRule) { if (pokemon.evolutionRule instanceof HatchEvolutionRule) { @@ -1292,14 +1286,26 @@ export class OnUpdatePhaseCommand extends Command { // remove after one fight player.board.delete(key) player.board.delete(pokemon.id) - player.updateSynergies() - if (!player.shopLocked) { - this.state.shop.assignShop(player, false, this.state) // refresh unown shop in case player lost psychic 6 - } } }) - // Refreshes effects (like tapu Terrains) + + // Refreshes effects (Tapu Terrains, or if player lost Psychic 6 after Unown diseappeared) player.updateSynergies() + + // Refreshes shop + if (!player.isBot) { + if (!player.shopLocked) { + if (player.shop.every((p) => Unowns.includes(p))) { + // player stayed on unown shop and did nothing, so we remove its free roll + player.shopFreeRolls -= 1 + } + + this.state.shop.assignShop(player, false, this.state) + } else { + this.state.shop.refillShop(player, this.state) + player.shopLocked = false + } + } } }) diff --git a/app/types/index.ts b/app/types/index.ts index 7cc23862bf..a1e894f69d 100644 --- a/app/types/index.ts +++ b/app/types/index.ts @@ -338,6 +338,7 @@ export interface IPlayer { money: number life: number shopLocked: boolean + shopFreeRolls: number streak: number interest: number opponentId: string