From 103c87ec3b5014cf89b0692402b3f1fe66bbdbfc Mon Sep 17 00:00:00 2001 From: Frederico Santos Date: Thu, 12 Sep 2024 01:09:44 +0100 Subject: [PATCH 01/18] Undo egg skip event --- src/modifier/modifier-type.ts | 5 +---- src/phases/trainer-victory-phase.ts | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index f7041d55be3..20047e5b81b 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1545,7 +1545,6 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.TEMP_STAT_STAGE_BOOSTER, 4), new WeightedModifierType(modifierTypes.BERRY, 2), new WeightedModifierType(modifierTypes.TM_COMMON, 2), - new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0, 1), ].map(m => { m.setTier(ModifierTier.COMMON); return m; }), @@ -1616,7 +1615,6 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), new WeightedModifierType(modifierTypes.TERA_SHARD, 1), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 4 : 0), - new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount * 3, 0) : 0, 3), ].map(m => { m.setTier(ModifierTier.GREAT); return m; }), @@ -1697,7 +1695,6 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.RARE_FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24), new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36), new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36), - new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(9 - rerollCount * 3, 0) : 0, 9), ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), @@ -1706,7 +1703,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SHINY_CHARM, 14), new WeightedModifierType(modifierTypes.HEALING_CHARM, 18), new WeightedModifierType(modifierTypes.MULTI_LENS, 18), - new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(15 - rerollCount * 5, 0) : 0, 15), + new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) ? 1 : 0, 1), ].map(m => { diff --git a/src/phases/trainer-victory-phase.ts b/src/phases/trainer-victory-phase.ts index 7815244c35c..a38874c9acd 100644 --- a/src/phases/trainer-victory-phase.ts +++ b/src/phases/trainer-victory-phase.ts @@ -30,7 +30,7 @@ export class TrainerVictoryPhase extends BattlePhase { const trainerType = this.scene.currentBattle.trainer?.config.trainerType!; // TODO: is this bang correct? if (vouchers.hasOwnProperty(TrainerType[trainerType])) { if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer?.config.isBoss) { - this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM][vouchers[TrainerType[trainerType]].voucherType])); + this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM][vouchers[TrainerType[trainerType]].voucherType])); } } From 801b0a66f715584aa3a61ce3c6684093c58c6f10 Mon Sep 17 00:00:00 2001 From: Frederico Santos Date: Thu, 12 Sep 2024 01:13:22 +0100 Subject: [PATCH 02/18] Readded vouchers to original weights --- src/modifier/modifier-type.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 20047e5b81b..d6cfd017829 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1615,6 +1615,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), new WeightedModifierType(modifierTypes.TERA_SHARD, 1), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 4 : 0), + new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0, 1), ].map(m => { m.setTier(ModifierTier.GREAT); return m; }), @@ -1695,6 +1696,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.RARE_FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24), new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36), new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36), + new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount * 1, 0) : 0, 3), ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), From 7ea608fb8aaa0769e6a9799cbb3b1c45d3dc9474 Mon Sep 17 00:00:00 2001 From: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> Date: Mon, 16 Sep 2024 11:56:55 +0200 Subject: [PATCH 03/18] [Bug] Fix Dire Hit & System Data Conversion Failure (#4282) Co-authored-by: xsn34kzx --- src/system/version-converter.ts | 40 +++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/system/version-converter.ts b/src/system/version-converter.ts index f7996124886..6cb2c24d84d 100644 --- a/src/system/version-converter.ts +++ b/src/system/version-converter.ts @@ -22,15 +22,25 @@ export function applySessionDataPatches(data: SessionSaveData) { } else if (m.className === "PokemonResetNegativeStatStageModifier") { m.className = "ResetNegativeStatStageModifier"; } else if (m.className === "TempBattleStatBoosterModifier") { - m.className = "TempStatStageBoosterModifier"; - m.typeId = "TEMP_STAT_STAGE_BOOSTER"; + // Dire Hit no longer a part of the TempBattleStatBoosterModifierTypeGenerator + if (m.typeId !== "DIRE_HIT") { + m.className = "TempStatStageBoosterModifier"; + m.typeId = "TEMP_STAT_STAGE_BOOSTER"; - // Migration from TempBattleStat to Stat - const newStat = m.typePregenArgs[0] + 1; - m.typePregenArgs[0] = newStat; + // Migration from TempBattleStat to Stat + const newStat = m.typePregenArgs[0] + 1; + m.typePregenArgs[0] = newStat; + + // From [ stat, battlesLeft ] to [ stat, maxBattles, battleCount ] + m.args = [ newStat, 5, m.args[1] ]; + } else { + m.className = "TempCritBoosterModifier"; + m.typePregenArgs = []; + + // From [ stat, battlesLeft ] to [ maxBattles, battleCount ] + m.args = [ 5, m.args[1] ]; + } - // From [ stat, battlesLeft ] to [ stat, maxBattles, battleCount ] - m.args = [ newStat, 5, m.args[1] ]; } else if (m.className === "DoubleBattleChanceBoosterModifier" && m.args.length === 1) { let maxBattles: number; switch (m.typeId) { @@ -73,7 +83,7 @@ export function applySystemDataPatches(data: SystemSaveData) { case "1.0.3": case "1.0.4": // --- LEGACY PATCHES --- - if (data.starterData) { + if (data.starterData && data.dexData) { // Migrate ability starter data if empty for caught species Object.keys(data.starterData).forEach(sd => { if (data.dexData[sd]?.caughtAttr && (data.starterData[sd] && !data.starterData[sd].abilityAttr)) { @@ -104,12 +114,14 @@ export function applySystemDataPatches(data: SystemSaveData) { // --- PATCHES --- // Fix Starter Data - for (const starterId of defaultStarterSpecies) { - if (data.starterData[starterId]?.abilityAttr) { - data.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; - } - if (data.dexData[starterId]?.caughtAttr) { - data.dexData[starterId].caughtAttr |= DexAttr.FEMALE; + if (data.starterData && data.dexData) { + for (const starterId of defaultStarterSpecies) { + if (data.starterData[starterId]?.abilityAttr) { + data.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; + } + if (data.dexData[starterId]?.caughtAttr) { + data.dexData[starterId].caughtAttr |= DexAttr.FEMALE; + } } } } From ed10152fb45ab866b3cbea506c534287b4598f74 Mon Sep 17 00:00:00 2001 From: damocleas Date: Wed, 25 Sep 2024 10:13:22 -0400 Subject: [PATCH 04/18] [Enhancement] Add New Splash Text (#4358) * Splash Text Changes 1 * fix some commas, adjust two halloween texts * adjustments * Capitalization / Grammar from English * fixes * Update splash-messages.ts to match --------- Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/data/splash-messages.ts | 107 ++++++++++++++++++++++-- src/locales/en/splash-messages.json | 124 ++++++++++++++++++++++++---- 2 files changed, 209 insertions(+), 22 deletions(-) diff --git a/src/data/splash-messages.ts b/src/data/splash-messages.ts index b8069f77737..a257b748734 100644 --- a/src/data/splash-messages.ts +++ b/src/data/splash-messages.ts @@ -54,7 +54,7 @@ const commonSplashMessages = [ ...Array(BATTLES_WON_WEIGHT_MULTIPLIER).fill("battlesWon"), "joinTheDiscord", "infiniteLevels", - "everythingStacks", + "everythingIsStackable", "optionalSaveScumming", "biomes", "openSource", @@ -66,9 +66,9 @@ const commonSplashMessages = [ "infiniteFusionAtHome", "brokenEggMoves", "magnificent", - "mubstitute", + "doPeopleReadThis", "thatsCrazy", - "oranceJuice", + "gottaCatchEmAll", "questionableBalancing", "coolShaders", "aiFree", @@ -77,14 +77,105 @@ const commonSplashMessages = [ "moreAddictiveThanIntended", "mostlyConsistentSeeds", "achievementPointsDontDoAnything", - "youDoNotStartAtLevel", - "dontTalkAboutTheManaphyEggIncident", + "nothingBeatsAJellyFilledDonut", + "dontTalkAboutTheTinkatonIncident", "alsoTryPokengine", "alsoTryEmeraldRogue", "alsoTryRadicalRed", "eeveeExpo", - "ynoproject", + "checkOutYnoproject", "breedersInSpace", + "alsoTryPokemonUnbound", + "tryTheJohtoDragonChallenge", + "basicReadingAbilityRecommended", + "shoutoutsToTheArtists", + "gamblingNotEncouraged", + "dontForgetToTakeABreak", + "wEvent", + "ifItsNotAccurateItsAccurate", + "everyLossIsProgressMade", + "liveWoChienReaction", + "itsAFeatureNotABug", + "theEggsAreNotForEating", + "7.8outOf10TooManyWaterBiomes", + "butNothingHappened", + "thePowerOfScienceIsAmazing", + "freeToPlay", + "theresATimeAndPlaceForEverything", + "nowWithShinierShinies", + "smilesGoForMiles", + "certainlyNotDragonFree", + "haveANiceDay", + "redacted", + "hi", + "transRights", + "shinyOddsHigherThanYouThink", + "noFalseTrades", + "notForProfit", + "timeForYourDailyRun", + "moreEggsThanADaycare", + "disclaimerHarshSunDoesNotGiveVitaminD", + "whoNeedsAMap", + "luxrayIsNotADarkType", + "selfDestructiveEncounters", + "mostOptionsAreViable", + "pokerogueMorse", + "smiley", + "beAwareOfPassives", + "asSeenOnTheWorldWideWeb", + "vaultinVeluzas", + "tooManyStarters", + "checkTheWiki", + "winWithYourFavorites", + "alsoTryPokerogueWait", + "theWayISeeItKyogreIsSurrounded", + "tryOutHoneyGather", + "notForTheFaintOfHeart", + "p", + "flipYourDeviceToEvolveInkay", + "inArceusWeTrust", + "whyDidTheTorchicCrossTheRoad", + "goodLuck", + "fuseWisely", + "compensation", + "prepareForTroubleAndMakeItDouble", + "anEggForYourTroubles", + "regirock", + "hereForAGoodTime", + "getGoodOrDont", + "checkTheSubreddit", + "betterNerfGreninja", + "inCaseOfUpdateClearYourCache", + "insertTextHere", + "endingEndlessNotFound", + "iLikeMyEggsVouchered", + "YOU", + "noAddedSugar", + "notSponsored", + "notRated", + "justOneMoreWaveMom", + "saltCured", + "onlyOnPokerogueNet", + "pixelPerfection", + "openSource", + "probablyGood", + "itsAMonsterHouse", + "dontForgetYourPassword", + "tripleTripleTripleAxel", + "questionExclamation", + "clownEncounters", + "fullOfBerries", + "limitsAreMeantToBeBrokenSometimes", + "keepItCasual", + "serversProbablyWorking", + "mew", + "makeItRainAndYourProblemsGoAway", + "customMusicTracks", + "youAreValid", + "number591IsLookingOff", + "timeForYourDeliDelivery", + "goodFirstImpression", + "iPreferRarerCandies", ]; //#region Seasonal Messages @@ -94,13 +185,13 @@ const seasonalSplashMessages: Season[] = [ name: "Halloween", start: "09-15", end: "10-31", - messages: ["halloween.pumpkaboosAbout", "halloween.mayContainSpiders", "halloween.spookyScaryDuskulls"], + messages: ["halloween.pumpkabooAbout", "halloween.mayContainSpiders", "halloween.spookyScarySkeledirge", "halloween.gourgeistUsedTrickOrTreat", "halloween.letsSnuggleForever"], }, { name: "XMAS", start: "12-01", end: "12-26", - messages: ["xmas.happyHolidays", "xmas.delibirdSeason"], + messages: ["xmas.happyHolidays", "xmas.unaffilicatedWithDelibirdServices", "xmas.delibirdSeason", "xmas.diamondsFromTheSky", "xmas.holidayStylePikachuNotIncluded"], }, { name: "New Year's", diff --git a/src/locales/en/splash-messages.json b/src/locales/en/splash-messages.json index 168974525f8..b7f7c737344 100644 --- a/src/locales/en/splash-messages.json +++ b/src/locales/en/splash-messages.json @@ -1,10 +1,10 @@ { - "battlesWon": "{{count, number}} Battles Won!", + "battlesWon": "Battles Won!", "joinTheDiscord": "Join the Discord!", "infiniteLevels": "Infinite Levels!", - "everythingStacks": "Everything Stacks!", + "everythingIsStackable": "Everything Is Stackable*!", "optionalSaveScumming": "Optional Save Scumming!", - "biomes": "35 Biomes!", + "biomes": "38 Biomes!", "openSource": "Open Source!", "playWithSpeed": "Play with 5x Speed!", "liveBugTesting": "Live Bug Testing!", @@ -14,9 +14,9 @@ "infiniteFusionAtHome": "Infinite Fusion at Home!", "brokenEggMoves": "Broken Egg Moves!", "magnificent": "Magnificent!", - "mubstitute": "Mubstitute!", + "doPeopleReadThis": "Do People Read This?", "thatsCrazy": "That's Crazy!", - "oranceJuice": "Orance Juice!", + "gottaCatchEmAll": "Gotta Catch 'Em All!", "questionableBalancing": "Questionable Balancing!", "coolShaders": "Cool Shaders!", "aiFree": "AI-Free!", @@ -25,24 +25,120 @@ "moreAddictiveThanIntended": "More Addictive than Intended!", "mostlyConsistentSeeds": "Mostly Consistent Seeds!", "achievementPointsDontDoAnything": "Achievement Points Don't Do Anything!", - "youDoNotStartAtLevel": "You Do Not Start at Level 2000!", - "dontTalkAboutTheManaphyEggIncident": "Don't Talk About the Manaphy Egg Incident!", + "nothingBeatsAJellyFilledDonut": "Nothing Beats a Jelly-Filled Donut!", + "dontTalkAboutTheTinkatonIncident": "Don't Talk About the Tinkaton Incident!", "alsoTryPokengine": "Also Try Pokéngine!", "alsoTryEmeraldRogue": "Also Try Emerald Rogue!", "alsoTryRadicalRed": "Also Try Radical Red!", "eeveeExpo": "Eevee Expo!", - "ynoproject": "YNOproject!", - "breedersInSpace": "Breeders in space!", + "checkOutYnoproject": "Check out YNOproject!", + "breedersInSpace": "Breeders in Space!", + "alsoTryPokemonUnbound": "Also Try Pokemon Unbound!", + "tryTheJohtoDragonChallenge": "Try the Johto Dragon Challenge!", + "basicReadingAbilityRecommended": "Basic Reading Ability Recommended!", + "shoutoutsToTheArtists": "Shoutouts to the Artists!", + "gamblingNotEncouraged": "Gambling Not Encouraged!", + "dontForgetToTakeABreak": "Don't Forget To Take a Break!", + "wEvent": "W Event", + "ifItsNotAccurateItsAccurate": "If It's Not 100% Accurate, It's 50%.", + "everyLossIsProgressMade": "Every Loss Is Progress Made!", + "liveWoChienReaction": "Live Wo-Chien Reaction:", + "itsAFeatureNotABug": "It's a Feature, Not a Bug!", + "theEggsAreNotForEating": "The Eggs Are Not for Eating!", + "7.8outOf10TooManyWaterBiomes": "7.8 out of 10, Too Many Water Biomes.", + "butNothingHappened": "But Nothing Happened!", + "thePowerOfScienceIsAmazing": "The Power of Science Is Amazing!", + "freeToPlay": "Free To Play!", + "theresATimeAndPlaceForEverything": "There's a Time and Place for Everything!", + "nowWithShinierShinies": "Now With Shinier Shinies!", + "smilesGoForMiles": "Smiles Go for Miles!", + "certainlyNotDragonFree": "Certainly Not Dragon Free!", + "haveANiceDay": "Have a Nice Day!", + "redacted": "[REDACTED]", + "hi": "hi", + "transRights": "Trans Rights!", + "shinyOddsHigherThanYouThink": "Shiny Odds Higher Than You Think!", + "noFalseTrades": "No False Trades!", + "notForProfit": "Not for Profit!", + "timeForYourDailyRun": "Time for Your Daily Run!", + "moreEggsThanADaycare": "More Eggs Than a Daycare!", + "disclaimerHarshSunDoesNotGiveVitaminD": "Disclaimer: Harsh Sun Does NOT Give Vitamin D!", + "whoNeedsAMap": "Who Needs a Map?", + "luxrayIsNotADarkType": "Luxray Is Not a Dark-Type!", + "selfDestructiveEncounters": "Self-Destructive Encounters!", + "mostOptionsAreViable": "Most Options Are Viable!", + "pokerogueMorse": ".--. --- -.- . .-. --- --. ..- .", + "smiley": ":)", + "beAwareOfPassives": "Be Aware of Passives!", + "asSeenOnTheWorldWideWeb": "As Seen on the World-Wide Web!", + "vaultinVeluzas": "Vaultin' Veluza!", + "tooManyStarters": "Too Many Starters!", + "checkTheWiki": "Check the Wiki!", + "winWithYourFavorites": "Win With Your Favorites!", + "alsoTryPokerogueWait": "Also Try PokéRogue! Wait...", + "theWayISeeItKyogreIsSurrounded": "The Way I See It, Kyogre Is Surrounded...", + "tryOutHoneyGather": "Try out Honey Gather!", + "notForTheFaintOfHeart": "Not for the Faint of Heart!", + "p": "(P)", + "flipYourDeviceToEvolveInkay": "Flip Your Device To Evolve Inkay!", + "inArceusWeTrust": "In Arceus We Trust", + "whyDidTheTorchicCrossTheRoad": "Why Did the Torchic Cross the Road?", + "goodLuck": "Good Luck!", + "fuseWisely": "Fuse Wisely!", + "compensation": "Compensation?", + "prepareForTroubleAndMakeItDouble": "Prepare for Trouble! And Make It Double!", + "anEggForYourTroubles": "An Egg for Your Troubles?", + "regirock": "ÜN ÜN ÜN", + "hereForAGoodTime": "Here for a Good Time!", + "getGoodOrDont": "Get Good! Or Don't!", + "checkTheSubreddit": "Check out the Subreddit!", + "betterNerfGreninja": "Better Nerf Greninja!", + "inCaseOfUpdateClearYourCache": "In Case of Update, Clear Your Cache!", + "insertTextHere": "insert text here", + "endingEndlessNotFound": "ending_endless not found", + "iLikeMyEggsVouchered": "I Like My Eggs Vouchered!", + "YOU": "YOU!", + "noAddedSugar": "No Added Sugar!", + "notSponsored": "Not Sponsored!", + "notRated": "Not Rated!", + "justOneMoreWaveMom": "Just One More Wave, Mom!", + "saltCured": "Salt Cured!", + "onlyOnPokerogueNet": "Only on pokerogue.net!", + "pixelPerfection": "Pixel Perfection!", + "openSource": "Open Source!", + "probablyGood": "Probably Good!", + "itsAMonsterHouse": "It's a Monster House!", + "dontForgetYourPassword": "Don't Forget Your Password!", + "tripleTripleTripleAxel": "Triple- Triple- Triple Axel!", + "questionExclamation": "?!", + "clownEncounters": "Clown Encounters!", + "fullOfBerries": "Full of Berries!", + "limitsAreMeantToBeBrokenSometimes": "Limits Are Meant To Be Broken, Sometimes!", + "keepItCasual": "Keep It Casual!", + "serversProbablyWorking": "Servers Probably Working!", + "mew": "Mew Probably Not Under a Truck!", + "makeItRainAndYourProblemsGoAway": "Make it Rain and your problems go away!", + "customMusicTracks": "Custom Music Tracks!", + "youAreValid": "You Are Valid!", + "number591IsLookingOff": "Number 591 Is Looking a Bit...", + "timeForYourDeliDelivery": "Time for Your Deli-Delivery!", + "goodFirstImpression": "Hope We Left a Good First Impression!", + "iPreferRarerCandies": "I Prefer Rarer Candies!", "halloween": { - "pumpkaboosAbout": "Pumpkaboos about!", - "mayContainSpiders": "May contain spiders!", - "spookyScaryDuskulls": "Spooky, Scary Duskulls!" + "pumpkabooAbout": "Pumpkaboo About!", + "mayContainSpiders": "May Contain Spiders!", + "spookyScarySkeledirge": "Spooky, Scary Skeledirge!", + "gourgeistUsedTrickOrTreat": "Gourgeist Used Trick-or-Treat!", + "letsSnuggleForever": "Let's Snuggle Forever!" }, "xmas": { "happyHolidays": "Happy Holidays!", - "delibirdSeason": "Delibird Season!" + "delibirdSeason": "Delibird Season!", + "unaffilicatedWithDelibirdServices": "Unaffiliated With Delibird Services!", + "diamondsFromTheSky": "Diamonds From the Sky!", + "holidayStylePikachuNotIncluded": "Holiday Style Pikachu Not Included!" }, "newYears": { "happyNewYear": "Happy New Year!" } -} \ No newline at end of file +} From e53e175813c6b8a5d22dfda8ad009c49edc1a0c9 Mon Sep 17 00:00:00 2001 From: Chapybara-jp Date: Wed, 25 Sep 2024 16:13:51 +0200 Subject: [PATCH 05/18] [Localisation] [JA] Minor corrections to settings, achv, tutorial; added necessary possessive particle to all trainer-classes (#4415) * Update ability-trigger.json * Update ability.json * Update arena-flyout.json * Update arena-tag.json * Update battle.json * Update fight-ui-handler.json * Update berry.json * Update menu.json * Update party-ui-handler.json * Update starter-select-ui-handler.json * Update tutorial.json * Update move.json * Update battle.json * Update arena-flyout.json * Update arena-flyout.json * Update arena-tag.json * Update party-ui-handler.json * Update settings.json * Update move-trigger.json * Translate modifier-type.json * Update modifier-type.json * Translated modifier-type.json * Update move-trigger.json * Update move-trigger.json * Update move-trigger.json * Update modifier-type.json * Update dialogue.json * Update dialogue.json * Update dialogue.json * Update dialogue-misc.json * Update dialogue.json * Update dialogue-misc.json * Update dialogue-misc.json * Update dialogue.json * Update dialogue.json * Update dialogue.json * Update dialogue.json Archers and Arianas dialog taken from Pokemon Stadium 2, HGSS, LGP/LGE, FRLG * Update dialogue.json * Update dialogue.json * Update dialogue.json * Update menu.json * Update dialogue.json * dialogue.json * Update dialogue-final-boss.json * Update dialogue.json * Update dialogue.json * Update dialogue.json * Update settings.json * Update tutorial.json * Update tutorial.json * Update trainer-classes.json * Update achv.json --- src/locales/ja/achv.json | 20 +-- src/locales/ja/settings.json | 2 +- src/locales/ja/trainer-classes.json | 202 ++++++++++++++-------------- src/locales/ja/tutorial.json | 8 +- 4 files changed, 116 insertions(+), 116 deletions(-) diff --git a/src/locales/ja/achv.json b/src/locales/ja/achv.json index ad85e8aeb05..12f0a15dd43 100644 --- a/src/locales/ja/achv.json +++ b/src/locales/ja/achv.json @@ -37,7 +37,7 @@ "name_female": "ワンパンウーマン" }, "HealAchv": { - "description": "一つの 技や 特性や 持たせたアイテムで\n{{HP}}{{healAmount}}を 一気に 回復する" + "description": "1つの 技や 特性や 持たせたアイテムで\n{{HP}}{{healAmount}}を 一気に 回復する" }, "250_HEAL": { "name": "回復発見者" @@ -52,7 +52,7 @@ "name": "ジョーイさん" }, "LevelAchv": { - "description": "一つの ポケモンを Lv.{{level}}まで 上げる" + "description": "1匹の ポケモンを Lv.{{level}}まで 上げる" }, "LV_100": { "name": "まだまだだよ" @@ -83,27 +83,27 @@ }, "TRANSFER_MAX_STAT_STAGE": { "name": "連係プレー", - "description": "少なくとも 一つの 能力を 最大まで あげて\n他の 手持ちポケモンに バトンタッチする" + "description": "少なくとも 1つの 能力を 最大まで あげて\n他の 手持ちポケモンに バトンタッチする" }, "MAX_FRIENDSHIP": { "name": "マブ達", - "description": "一つの 手持ちポケモンの 仲良し度を 最大に 上げる" + "description": "1匹の 手持ちポケモンの 仲良し度を 最大に 上げる" }, "MEGA_EVOLVE": { "name": "ザ・アブソリュート", - "description": "一つの 手持ちポケモンを メガシンカさせる" + "description": "1匹の 手持ちポケモンを メガシンカさせる" }, "GIGANTAMAX": { "name": "太ーくて堪らない", - "description": "一つの 手持ちポケモンを キョダイマックスさせる" + "description": "1匹の 手持ちポケモンを キョダイマックスさせる" }, "TERASTALLIZE": { "name": "一致好き", - "description": "一つの 手持ちポケモンを テラスタルさせる" + "description": "1匹の 手持ちポケモンを テラスタルさせる" }, "STELLAR_TERASTALLIZE": { "name": "隠れたタイプ", - "description": "一つの 手持ちポケモンを ステラ・テラスタルさせる" + "description": "1匹の 手持ちポケモンを ステラ・テラスタルさせる" }, "SPLICE": { "name": "インフィニット・フュージョン", @@ -155,7 +155,7 @@ }, "PERFECT_IVS": { "name": "個体値の賞状", - "description": "一つの ポケモンの 個体値を すべて 最大に する" + "description": "1匹の ポケモンの 個体値を すべて 最大に する" }, "CLASSIC_VICTORY": { "name": "無双", @@ -163,7 +163,7 @@ }, "UNEVOLVED_CLASSIC_VICTORY": { "name": "はじめてのおつかい", - "description": "少なくとも 一つの 進化していない 手持ちポケモンで\nクラシックモードを クリアする" + "description": "少なくとも 1匹の 進化していない 手持ちポケモンで\nクラシックモードを クリアする" }, "MONO_GEN_ONE": { "name": "原始", diff --git a/src/locales/ja/settings.json b/src/locales/ja/settings.json index afb2f94a047..7bdc9b59fc9 100644 --- a/src/locales/ja/settings.json +++ b/src/locales/ja/settings.json @@ -10,7 +10,7 @@ "hpBarSpeed": "HPバー増減の速さ", "expGainsSpeed": "経験値バー増加の速さ", "expPartyDisplay": "手持ちの経験値取得表示", - "skipSeenDialogues": "もう見た話をスキップ", + "skipSeenDialogues": "もう見た話を飛ばす", "battleStyle": "試合のルール", "enableRetries": "再挑戦を有効にする", "hideIvs": "個体値スキャナーを隠す", diff --git a/src/locales/ja/trainer-classes.json b/src/locales/ja/trainer-classes.json index a104e4e827e..e9c14c0af87 100644 --- a/src/locales/ja/trainer-classes.json +++ b/src/locales/ja/trainer-classes.json @@ -1,105 +1,105 @@ { - "ace_trainer": "エリートトレーナー", - "ace_trainer_female": "エリートトレーナー", - "ace_duo": "エリートコンビ", - "artist": "芸術家", - "artist_female": "芸術家", - "backers": "ファンクラブ", - "backpacker": "バックパッカー", - "backpacker_female": "バックパッカー", - "backpackers": "バックパッカーズ", - "baker": "ベーカリー", - "battle_girl": "バトルガール", - "beauty": "大人のおねえさん", - "beginners": "初心者", - "biker": "暴走族", - "black_belt": "カラテ王", - "breeder": "ポケモンブリーダー", - "breeder_female": "ポケモンブリーダー", - "breeders": "ブリーダーコンビ", - "clerk": "ビジネスマン", - "clerk_female": "OL", - "colleagues": "ビジネスパートナー", - "crush_kin": "格闘兄妹", - "cyclist": "サイクリング", - "cyclist_female": "サイクリング", - "cyclists": "サイクリングチーム", - "dancer": "ダンサー", - "dancer_female": "ダンサー", - "depot_agent": "鉄道員", - "doctor": "ドクター", - "doctor_female": "ドクター", - "firebreather": "火吹きやろう", - "fisherman": "釣り人", - "fisherman_female": "釣り人", - "gentleman": "ジェントルマン", - "guitarist": "ギタリスト", - "guitarist_female": "ギタリスト", - "harlequin": "クラウン", - "hiker": "山男", - "hooligans": "バッドチーム", - "hoopster": "バスケ選手", - "infielder": "野球選手", - "janitor": "清掃員", - "lady": "お嬢さま", - "lass": "ミニスカート", - "linebacker": "フットボーラー", - "maid": "メイド", - "madame": "マダム", - "medical_team": "医療チーム", - "musician": "ミュージシャン", - "hex_maniac": "オカルトマニア", - "nurse": "ナース", - "nursery_aide": "保育士", - "officer": "お巡りさん", - "parasol_lady": "パラソルおねえさん", - "pilot": "パイロット", - "pokéfan": "大好きクラブ", - "pokéfan_female": "大好きクラブ", - "pokéfan_family": "大好き夫婦", - "preschooler": "園児", - "preschooler_female": "園児", - "preschoolers": "園児たち", - "psychic": "サイキッカー", - "psychic_female": "サイキッカー", - "psychics": "サイキッ家", - "pokémon_ranger": "ポケモンレンジャー", - "pokémon_ranger_female": "ポケモンレンジャー", - "pokémon_rangers": "レンジャーズ", - "ranger": "レンジャー", - "restaurant_staff": "レストランスタッフ", - "rich": "お金持ち", - "rich_female": "お金持ち", - "rich_boy": "お坊っちゃま", - "rich_couple": "お二人さま", - "rich_kid": "ブルジョワ男子", - "rich_kid_female": "ブルジョワ女子", - "rich_kids": "ブルジョワ子達", - "roughneck": "スキンヘッズ", - "sailor": "船乗り", - "scientist": "研究員", - "scientist_female": "研究員", - "scientists": "研究チーム", - "smasher": "テニスプレイヤー", - "snow_worker": "冷凍作業員", - "snow_worker_female": "冷凍作業員", - "striker": "サッカー選手", - "school_kid": "塾帰り", - "school_kid_female": "塾帰り", - "school_kids": "塾生たち", - "swimmer": "海パンやろう", - "swimmer_female": "ビキニのおねえさん", - "swimmers": "水着カップル", - "twins": "双子ちゃん", - "veteran": "ベテラントレーナー", - "veteran_female": "ベテラントレーナー", - "veteran_duo": "ベテランコンビ", - "waiter": "ウエーター", - "waitress": "ウエートレス", - "worker": "作業員", - "worker_female": "作業員", - "workers": "作業班", - "youngster": "短パン小僧", + "ace_trainer": "エリートトレーナーの ", + "ace_trainer_female": "エリートトレーナーの ", + "ace_duo": "エリートコンビの ", + "artist": "芸術家の ", + "artist_female": "芸術家の ", + "backers": "ファンクラブの ", + "backpacker": "バックパッカーの ", + "backpacker_female": "バックパッカーの ", + "backpackers": "バックパッカーズの ", + "baker": "ベーカリーの ", + "battle_girl": "バトルガールの ", + "beauty": "大人のおねえさんの ", + "beginners": "初心者の ", + "biker": "暴走族の ", + "black_belt": "カラテ王の ", + "breeder": "ポケモンブリーダーの ", + "breeder_female": "ポケモンブリーダーの ", + "breeders": "ブリーダーコンビの ", + "clerk": "ビジネスマンの ", + "clerk_female": "OLの ", + "colleagues": "ビジネスパートナーの ", + "crush_kin": "格闘兄妹の ", + "cyclist": "サイクリングの ", + "cyclist_female": "サイクリングの ", + "cyclists": "サイクリングチームの ", + "dancer": "ダンサーの ", + "dancer_female": "ダンサーの ", + "depot_agent": "鉄道員の ", + "doctor": "ドクターの ", + "doctor_female": "ドクターの ", + "firebreather": "火吹きやろうの ", + "fisherman": "釣り人の ", + "fisherman_female": "釣り人の ", + "gentleman": "ジェントルマンの ", + "guitarist": "ギタリストの ", + "guitarist_female": "ギタリストの ", + "harlequin": "クラウンの ", + "hiker": "山男の ", + "hooligans": "バッドチームの ", + "hoopster": "バスケ選手の ", + "infielder": "野球選手の ", + "janitor": "清掃員の ", + "lady": "お嬢さまの ", + "lass": "ミニスカートの ", + "linebacker": "フットボーラーの ", + "maid": "メイドの ", + "madame": "マダムの ", + "medical_team": "医療チームの ", + "musician": "ミュージシャンの ", + "hex_maniac": "オカルトマニアの ", + "nurse": "ナースの ", + "nursery_aide": "保育士の ", + "officer": "お巡りさんの ", + "parasol_lady": "パラソルおねえさんの ", + "pilot": "パイロットの ", + "pokéfan": "大好きクラブの ", + "pokéfan_female": "大好きクラブの ", + "pokéfan_family": "大好き夫婦の ", + "preschooler": "園児の ", + "preschooler_female": "園児の ", + "preschoolers": "園児たちの ", + "psychic": "サイキッカーの ", + "psychic_female": "サイキッカーの ", + "psychics": "サイキッ家の ", + "pokémon_ranger": "ポケモンレンジャーの ", + "pokémon_ranger_female": "ポケモンレンジャーの ", + "pokémon_rangers": "レンジャーズの ", + "ranger": "レンジャーの ", + "restaurant_staff": "レストランスタッフの ", + "rich": "お金持ちの ", + "rich_female": "お金持ちの ", + "rich_boy": "お坊っちゃまの ", + "rich_couple": "お二人さまの ", + "rich_kid": "ブルジョワ男子の ", + "rich_kid_female": "ブルジョワ女子の ", + "rich_kids": "ブルジョワ子達の ", + "roughneck": "スキンヘッズの ", + "sailor": "船乗りの ", + "scientist": "研究員の ", + "scientist_female": "研究員の ", + "scientists": "研究チームの ", + "smasher": "テニスプレイヤーの ", + "snow_worker": "冷凍作業員の ", + "snow_worker_female": "冷凍作業員の ", + "striker": "サッカー選手の ", + "school_kid": "塾帰りの ", + "school_kid_female": "塾帰りの ", + "school_kids": "塾生たちの ", + "swimmer": "海パンやろうの ", + "swimmer_female": "ビキニのおねえさんの ", + "swimmers": "水着カップルの ", + "twins": "双子ちゃんの ", + "veteran": "ベテラントレーナーの ", + "veteran_female": "ベテラントレーナーの ", + "veteran_duo": "ベテランコンビの ", + "waiter": "ウエーターの ", + "waitress": "ウエートレスの ", + "worker": "作業員の ", + "worker_female": "作業員の ", + "workers": "作業班の ", + "youngster": "短パン小僧の ", "rocket_grunt": "ロケット団の下っ端", "rocket_grunts": " ロケット団の下っ端", "rocket_grunt_female": "ロケット団の下っ端", diff --git a/src/locales/ja/tutorial.json b/src/locales/ja/tutorial.json index 99019b03f7f..a9018a53144 100644 --- a/src/locales/ja/tutorial.json +++ b/src/locales/ja/tutorial.json @@ -2,9 +2,9 @@ "intro": "PokéRogueへ ようこそ! ローグライク要素が\n加わった バトル中心の ポケモンファンゲームです。\n$このゲームは 収益を上げず、Pokémonおよび 使用される\n著作権資産に 対する所有権を 主張しません。\n$ゲームは まだ開発中ですが、完全に プレイすることが できます。\nバグ報告は ディスコードコミュニティを ご利用ください。\n$ゲームが 遅い場合は、ブラウザ設定で「ハードウェア\nアクセラレーション」が オンになっている ことを 確認してください。", "accessMenu": "メニューを開くには 入力待ちの間に Mキー/Escを 押してください。\nメニューには 設定や 様々な機能が 含まれています。", "menu": "このメニューから 設定が 開けます。\n$設定では、ゲームの速さや ウィンドウタイプなどの オプションを 変更できます。\n$ここには 様々な機能が ありますので、\nぜひ 確認してみてください!", - "starterSelect": "この画面では Zキー/空白キーを押して ポケモンが 選択できます。\n選んだポケモンは 最初の手持ちに なります。\n$各ポケモンは ポイントが ある。最大6つを 選べますが\nポケモンのポイントが 合計10を超えては いけません。\n$ポケモンを 捕まえたり タマゴからふかしたり することで\n選択できる 性別、特性、フォルムなどの 幅を広げられます。\n$個体値も 徐々に 累積して 高くなるので、\n同じポケモンを たくさん 捕まえて みてください!", + "starterSelect": "この画面では Zキー/空白キーを押して ポケモンが 選択できます。\n選んだポケモンは 最初の手持ちに なります。\n$各ポケモンは ポイントが ある。最大6つを 選べますが\nポケモンのポイントが 合計10を超えては いけません。\n$ポケモンを 捕まえたり タマゴからふかしたり することで\n選択できる 性別、特性、フォルムなどの 幅を広げられます。\n$個体値も 徐々に 累積して 高くなるから\n同じポケモンを たくさん 捕まえて みてください!", "pokerus": "毎日、無作為に スターターの\n3種類には 紫色の枠が 表示されます。\n$登録された スターターの 中に いれば、\n手持ちに加えて 強さを 確認してみましょう!", - "statChange": "ポケモンを 入れ替えない限り、\n次のバトルでも 能力変化は なくなりません。\n$その代わりに、トレーナーバトルや 新しいバイオームに\n入る直前に 自動的に 能力変化は 元に戻ります。\n$Cキー/Shiftキーを 押し続けると、\n場にいるポケモンの 能力変化を 確認できます。\n$Vキーを押すと、\n相手が出した技も 確認できます。\n$ただし、現在のバトルでの 相手ポケモンが\nすでに使った 技のみが 表示されます。", - "selectItem": "バトルが 終わるたびには、「ショップ」という\n画面で 3つのご褒美から 1つが選べます。\n$種類は 消耗品、ポケモンの持ち物や道具、\n永続的な パッシブアイテムなど 様々です。\n$ほとんどの 消耗しない 道具は\n効果が 累積されます。\n$例えば 進化アイテムなどの ご褒美は\n使用できる 場合にのみ 登場します。\n$持ち物や道具が\n手持ちポケモン間に 移動できる\n$持ち物や道具が あれば、ショップ画面の\n右下に「アイテム移行」が 表示されます。\n$ショップ画面で お金で 消耗品を 買えます。\nラウンドが 進むにつれて 買えるアイテムが 増えます。\n$ご褒美を 選択すると 次のラウンドに\n進むから、まず 消耗品を 買ってください。", - "eggGacha": "この画面では、「タマゴクーポン」で\nポケモンのタマゴを 取得できます。\n$タマゴは ラウンドが進めるうちに ふかします。\nタマゴのふかは レア度によって 時間が かかります。\n$ふかしたポケモンは 手持ちに 加えられず、\nスターターに 登録されます。\n$ふかしたポケモンは 一般的に\n野生ポケモンよりも 高い個体値があります。\n$あるポケモンは タマゴからしか 手に入りません。\n$各ガチャマシンは 個性的なボーナスが あるますから、\n好きな方から 引いてみてください!," + "statChange": "ポケモンを 入れ替えない限り、\n次のバトルでも 能力変化は なくなりません。\n$その代わりに、トレーナーバトルや 新しいバイオームに\n入る直前に 能力変化は 自動的に 元に戻ります。\n$Cキー/Shiftキーを 押し続けると、\n場にいるポケモンの 能力変化を 確認できます。\n$Vキーを 押し続けると、\n相手が出した技と 場の効果を 確認できます。\n$ただし 現在のバトルでの 相手ポケモンが\nすでに 使った 技のみ 表示されます。", + "selectItem": "バトルが 終わるたびには、「ショップ」という\n画面で 3つのご褒美から 1つが選べます。\n$種類は 消耗品、ポケモンの持ち物や道具、\n永続的な パッシブアイテムなど 様々です。\n$ほとんどの 消耗しない 道具は\n効果が 累積されます。\n$例えば 進化アイテムなどの ご褒美は\n使用できる 場合のみに 登場します。\n$持ち物や 道具が\n手持ちポケモン画面に 移動できます。\n$持ち物や 道具が あれば、 ショップ画面の\n右下に「アイテム移行」が 表示されます。\n$ショップ画面で お金で 消耗品を 買えます。\nラウンドが進むにつれて 買えるアイテムが 増えます。\n$ご褒美を 選択すると 次の ラウンドに 進むから\nまずは 金で買える 消耗品を 買ってください。", + "eggGacha": "この画面では、「タマゴクーポン」で\nポケモンのタマゴを 取得できます。\n$タマゴは ラウンドが進めるうちに ふかします。\nタマゴのふかは レア度によって 時間が かかります。\n$ふかしたポケモンは 手持ちに 加えられずに\nスターターに 登録されます。\n$ふかしたポケモンは 一般的に\n野生ポケモンよりも 高い個体値が あります。\n$あるポケモンは タマゴからしか 手に入りません。\n$各ガチャマシンは 個性的な ボーナスが あるから\n好きな方から 引いてみてください!," } From 43879b4751b6f01b0babf4888a377376d60b49ff Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Wed, 25 Sep 2024 07:16:03 -0700 Subject: [PATCH 06/18] [Item] Eviolite no longer spawns for GMax pokemon (#4409) --- src/modifier/modifier-type.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 6503aaafbc5..8ba3599e72b 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1720,7 +1720,8 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.AMULET_COIN, skipInLastClassicWaveOrDefault(3)), new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => { if (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.unlocks[Unlockables.EVIOLITE]) { - return party.some(p => ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions))) && !p.getHeldItems().some(i => i instanceof Modifiers.EvolutionStatBoosterModifier)) ? 10 : 0; + return party.some(p => ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions))) + && !p.getHeldItems().some(i => i instanceof Modifiers.EvolutionStatBoosterModifier) && !p.isMax()) ? 10 : 0; } return 0; }), @@ -1728,19 +1729,24 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.LEEK, (party: Pokemon[]) => { const checkedSpecies = [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ]; // If a party member doesn't already have a Leek and is one of the relevant species, Leek can appear - return party.some(p => !p.getHeldItems().some(i => i instanceof Modifiers.SpeciesCritBoosterModifier) && (checkedSpecies.includes(p.getSpeciesForm(true).speciesId) || (p.isFusion() && checkedSpecies.includes(p.getFusionSpeciesForm(true).speciesId)))) ? 12 : 0; + return party.some(p => !p.getHeldItems().some(i => i instanceof Modifiers.SpeciesCritBoosterModifier) + && (checkedSpecies.includes(p.getSpeciesForm(true).speciesId) + || (p.isFusion() && checkedSpecies.includes(p.getFusionSpeciesForm(true).speciesId)))) ? 12 : 0; }, 12), new WeightedModifierType(modifierTypes.TOXIC_ORB, (party: Pokemon[]) => { const checkedAbilities = [Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.TOXIC_BOOST, Abilities.POISON_HEAL, Abilities.MAGIC_GUARD]; const checkedMoves = [Moves.FACADE, Moves.TRICK, Moves.FLING, Moves.SWITCHEROO, Moves.PSYCHO_SHIFT]; // If a party member doesn't already have one of these two orbs and has one of the above moves or abilities, the orb can appear - return party.some(p => !p.getHeldItems().some(i => i instanceof Modifiers.TurnStatusEffectModifier) && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => m && checkedMoves.includes(m.moveId)))) ? 10 : 0; + return party.some(p => !p.getHeldItems().some(i => i instanceof Modifiers.TurnStatusEffectModifier) + && (checkedAbilities.some(a => p.hasAbility(a, false, true)) + || p.getMoveset(true).some(m => m && checkedMoves.includes(m.moveId)))) ? 10 : 0; }, 10), new WeightedModifierType(modifierTypes.FLAME_ORB, (party: Pokemon[]) => { const checkedAbilities = [Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.FLARE_BOOST, Abilities.MAGIC_GUARD]; const checkedMoves = [Moves.FACADE, Moves.TRICK, Moves.FLING, Moves.SWITCHEROO, Moves.PSYCHO_SHIFT]; // If a party member doesn't already have one of these two orbs and has one of the above moves or abilities, the orb can appear - return party.some(p => !p.getHeldItems().some(i => i instanceof Modifiers.TurnStatusEffectModifier) && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => m && checkedMoves.includes(m.moveId)))) ? 10 : 0; + return party.some(p => !p.getHeldItems().some(i => i instanceof Modifiers.TurnStatusEffectModifier) + && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => m && checkedMoves.includes(m.moveId)))) ? 10 : 0; }, 10), new WeightedModifierType(modifierTypes.WHITE_HERB, (party: Pokemon[]) => { const checkedAbilities = [Abilities.WEAK_ARMOR, Abilities.CONTRARY, Abilities.MOODY, Abilities.ANGER_SHELL, Abilities.COMPETITIVE, Abilities.DEFIANT]; @@ -1795,7 +1801,8 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SHINY_CHARM, 14), new WeightedModifierType(modifierTypes.HEALING_CHARM, 18), new WeightedModifierType(modifierTypes.MULTI_LENS, 18), - new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5), + new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => + !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) ? 1 : 0, 1), ].map(m => { From 03bedac28359b870982fe210156707f368fd89b1 Mon Sep 17 00:00:00 2001 From: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> Date: Wed, 25 Sep 2024 16:20:33 +0200 Subject: [PATCH 07/18] [P3 Bug] Fix form name not always showing in starter select (#4406) Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/ui/starter-select-ui-handler.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 5ef26d1ba88..03defdbdb5c 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -260,6 +260,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonCandyCountText: Phaser.GameObjects.Text; private pokemonCaughtHatchedContainer: Phaser.GameObjects.Container; private pokemonCaughtCountText: Phaser.GameObjects.Text; + private pokemonFormText: Phaser.GameObjects.Text; private pokemonHatchedIcon : Phaser.GameObjects.Sprite; private pokemonHatchedCountText: Phaser.GameObjects.Text; private pokemonShinyIcon: Phaser.GameObjects.Sprite; @@ -287,7 +288,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private starterSelectMessageBox: Phaser.GameObjects.NineSlice; private starterSelectMessageBoxContainer: Phaser.GameObjects.Container; private statsContainer: StatsContainer; - private pokemonFormText: Phaser.GameObjects.Text; private moveInfoOverlay : MoveInfoOverlay; private statsMode: boolean; @@ -2288,6 +2288,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.filterInstructionRowX += 50; } } + updateInstructions(): void { this.instructionRowX = 0; this.instructionRowY = 0; @@ -2826,6 +2827,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonShinyIcon.setTint(tint); this.pokemonShinyIcon.setVisible(defaultProps.shiny); this.pokemonCaughtHatchedContainer.setVisible(true); + this.pokemonFormText.setVisible(true); + if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { this.pokemonCaughtHatchedContainer.setY(16); this.pokemonShinyIcon.setY(135); @@ -2849,7 +2852,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCandyDarknessOverlay.setVisible(true); this.pokemonCandyCountText.setText(`x${this.scene.gameData.starterData[species.speciesId].candyCount}`); this.pokemonCandyCountText.setVisible(true); - this.pokemonFormText.setVisible(true); this.pokemonFormText.setY(42); this.pokemonHatchedIcon.setVisible(true); this.pokemonHatchedCountText.setVisible(true); From e20d41bcbb186f1979e1dbd25f559b857ff76637 Mon Sep 17 00:00:00 2001 From: DanStevensonx <114961842+DanStevensonx@users.noreply.github.com> Date: Wed, 25 Sep 2024 18:28:41 +0200 Subject: [PATCH 08/18] [Localization] Spanish corrections (#4425) * Update game-stats-ui-handler.json * Update battle.json * Update dialogue.json * Update modifier-type.json * Update a-trainers-test-dialogue.json * Update absolute-avarice-dialogue.json * Update an-offer-you-cant-refuse-dialogue.json * Update berries-abound-dialogue.json * Update bug-type-superfan-dialogue.json * Update bug-type-superfan-dialogue.json * Update clowning-around-dialogue.json * Update dancing-lessons-dialogue.json * Update field-trip-dialogue.json * Update fun-and-games-dialogue.json * Update party-ui-handler.json * Update party-ui-handler.json * Update trainer-classes.json * Update trainer-names.json * Update trainer-titles.json * Update splash-messages.json * Update a-trainers-test-dialogue.json * Update bug-type-superfan-dialogue.json * Update clowning-around-dialogue.json * Update dancing-lessons-dialogue.json * Update splash-messages.json * Update clowning-around-dialogue.json --- src/locales/es/battle.json | 4 +- src/locales/es/dialogue.json | 12 +++--- src/locales/es/game-stats-ui-handler.json | 38 +++++++++---------- src/locales/es/modifier-type.json | 2 +- .../a-trainers-test-dialogue.json | 18 ++++----- .../absolute-avarice-dialogue.json | 4 +- .../an-offer-you-cant-refuse-dialogue.json | 8 ++-- .../berries-abound-dialogue.json | 8 ++-- .../bug-type-superfan-dialogue.json | 14 +++---- .../clowning-around-dialogue.json | 19 +++++----- .../dancing-lessons-dialogue.json | 8 ++-- .../field-trip-dialogue.json | 8 ++-- .../fun-and-games-dialogue.json | 8 ++-- src/locales/es/party-ui-handler.json | 6 +-- src/locales/es/trainer-classes.json | 6 +-- src/locales/es/trainer-names.json | 14 +++---- src/locales/es/trainer-titles.json | 4 +- 17 files changed, 91 insertions(+), 90 deletions(-) diff --git a/src/locales/es/battle.json b/src/locales/es/battle.json index 42c1346c118..4abd5054bc0 100644 --- a/src/locales/es/battle.json +++ b/src/locales/es/battle.json @@ -53,7 +53,7 @@ "noPokeballTrainer": "¡No está bien capturar los\nPokémon de los demás!", "noPokeballMulti": "¡No puedes lanzar Poké Balls\ncuando hay más de un Pokémon!", "noPokeballStrong": "Este Pokémon es demasiado fuerte para ser capturado.\n¡Baja sus PS!", - "noPokeballMysteryEncounter": "¡No puedes capturar este Pokémon!", + "noPokeballMysteryEncounter": "¡No puedes capturar a este Pokémon!", "noEscapeForce": "Una fuerza misteriosa\nte impide huir.", "noEscapeTrainer": "¡No puedes huir de los\ncombates contra entrenadores!", "noEscapePokemon": "¡{{moveName}} de {{pokemonName}} no te deja huir!", @@ -101,7 +101,7 @@ "congratulations": "¡Enhorabuena!", "beatModeFirstTime": "¡{{speciesName}} ha completado el modo {{gameMode}} por primera vez!\n¡Has conseguido {{newModifier}}!", "ppReduced": "¡El movimiento {{moveName}} de {{targetName}} ha perdido {{reduction}} PP!", - "mysteryEncounterAppeared": "¿Que es esto?", + "mysteryEncounterAppeared": "¿Qué es esto?", "battlerTagsHealBlock": "¡{{pokemonNameWithAffix}} no puede restaurar sus PS!", "battlerTagsHealBlockOnRemove": "¡{{pokemonNameWithAffix}} ya puede recuperar PS!" } diff --git a/src/locales/es/dialogue.json b/src/locales/es/dialogue.json index 4e10b17dfd8..167ab60b10e 100644 --- a/src/locales/es/dialogue.json +++ b/src/locales/es/dialogue.json @@ -73,8 +73,8 @@ "2": "No es fácil encontrar el equilibrio entre ataque y defensa..." }, "defeat": { - "1": "Necesitas curar a tus Pokémon?", - "2": "Necesitas curar a tus Pokémon?" + "1": "¿Necesitas curar a tus Pokémon?", + "2": "¿Necesitas curar a tus Pokémon?" } }, "stat_trainer_marley": { @@ -93,8 +93,8 @@ }, "stat_trainer_mira": { "encounter": { - "1": "Serás sorprendido por Maiza!", - "2": "¡Maiza te mostrará que Mira ya no se pierde!" + "1": "¡Maiza te sorprenderá!", + "2": "¡Maiza te mostrará que Maiza ya no se pierde!" }, "victory": { "1": "Maiza se pregunta si puede llegar muy lejos en esta tierra.", @@ -115,8 +115,8 @@ "2": "A veces combatimos entre nosotros y otras veces unimos fuerzas.$Es maravilloso ser entrenador." }, "defeat": { - "1": "Vaya demostración pusiste.\nMejor suerte la próxima vez.", - "2": "Vaya demostración pusiste.\nMejor suerte la próxima vez." + "1": "Menuda demostración hiciste.\nMejor suerte la próxima vez.", + "2": "Menuda demostración hiciste.\nMejor suerte la próxima vez." } }, "winstrates_victor": { diff --git a/src/locales/es/game-stats-ui-handler.json b/src/locales/es/game-stats-ui-handler.json index d79a0dcd9cc..5af023217b4 100644 --- a/src/locales/es/game-stats-ui-handler.json +++ b/src/locales/es/game-stats-ui-handler.json @@ -5,38 +5,38 @@ "starters": "Iniciales", "shinyStarters": "Shinies iniciales", "speciesSeen": "Especies vistas", - "speciesCaught": "Especies capturadas", + "speciesCaught": "Especies capt.", "ribbonsOwned": "Cintas obtenidas", - "classicRuns": "Partidas clásicas", - "classicWins": "Victorias clásicas", + "classicRuns": "Partidas en Clásico", + "classicWins": "Victorias en Clásico", "dailyRunAttempts": "Intentos del reto diario", "dailyRunWins": "Victorias del reto diario", - "endlessRuns": "Partidas Infinitas", - "highestWaveEndless": "Oleada récord (infinito)", - "highestMoney": "Dinero récord", - "highestDamage": "Daño máximo", + "endlessRuns": "Partidas en Infinito", + "highestWaveEndless": "Oleada récord (Infinito)", + "highestMoney": "Máximo dinero", + "highestDamage": "Máximo daño", "highestHPHealed": "Máximos PS curados", "pokemonEncountered": "Pokémon encontrados", "pokemonDefeated": "Pokémon derrotados", "pokemonCaught": "Pokémon capturados", "eggsHatched": "Huevos eclosionados", - "subLegendsSeen": "Sublegendarios vistos", + "subLegendsSeen": "Sub-legs. vistos", "subLegendsCaught": "Sub-legs. capturados", "subLegendsHatched": "Sub-legs. eclosionados", - "legendsSeen": "Legendarios vistos", - "legendsCaught": "Legendarios capturados", - "legendsHatched": "Legendarios eclosionados", - "mythicalsSeen": "Míticos vistos", + "legendsSeen": "Legs. vistos", + "legendsCaught": "Legs. capturados", + "legendsHatched": "Legs. eclosionados", + "mythicalsSeen": "Singulares vistos", "mythicalsCaught": "Singulares capturados", "mythicalsHatched": "Singulares eclosionados", "shiniesSeen": "Shinies vistos", "shiniesCaught": "Shinies capturados", "shiniesHatched": "Shinies eclosionados", - "pokemonFused": "Pokémons fusionados", - "trainersDefeated": "Entrenadores derrotados", - "eggsPulled": "Huevos canjeados", - "rareEggsPulled": "Huevos raros canjeados", - "epicEggsPulled": "Huevos épicos canjeados", - "legendaryEggsPulled": "Huevos legendarios canjeados", - "manaphyEggsPulled": "Huevos Manaphy canjeados" + "pokemonFused": "Pokémon fusionados", + "trainersDefeated": "Entren. derrotados", + "eggsPulled": "Huevos canj.", + "rareEggsPulled": "Huevos raros canj.", + "epicEggsPulled": "Huevos épicos canj.", + "legendaryEggsPulled": "Huevos legs. canj.", + "manaphyEggsPulled": "Huevos Manaphy canj." } diff --git a/src/locales/es/modifier-type.json b/src/locales/es/modifier-type.json index 472a28c77a0..365a8d9bfed 100644 --- a/src/locales/es/modifier-type.json +++ b/src/locales/es/modifier-type.json @@ -69,7 +69,7 @@ "description": "Aumenta la est. {{stat}} base del portador en un 10%.\nCuanto mayores sean tus IVs, mayor será el límite de acumulación." }, "PokemonBaseStatTotalModifierType": { - "name": "Jugo de Shuckle", + "name": "Zumo de Shuckle", "description": "{{increaseDecrease}} todas las estadísticas base del portador en {{statValue}}. Fuiste {{blessCurse}} por el Shuckle.", "extra": { "increase": "Aumenta", diff --git a/src/locales/es/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/es/mystery-encounters/a-trainers-test-dialogue.json index bc100f60454..55fb46b5ed7 100644 --- a/src/locales/es/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/es/mystery-encounters/a-trainers-test-dialogue.json @@ -1,14 +1,14 @@ { "intro": "Un entrenador extremadamente fuerte se te acerca...", "buck": { - "intro_dialogue": "¡Hola, entrenador! Me llamo Bulgur.$Tengo una propuesta súper genial para un entrenador fuerte como tú.$Llevo conmigo dos Huevos Pokémon raros, pero me gustaría que alguien más cuidara uno.$Si puedes demostrarme tu fuerza como entrenador, ¡te daré el huevo más raro", + "intro_dialogue": "¡Hola, entrenador! Me llamo Bulgur.$Tengo una propuesta súper genial para un entrenador fuerte como tú.$Llevo conmigo dos Huevos Pokémon raros, pero me gustaría que alguien más cuidara uno.$Si puedes demostrarme tu fuerza como entrenador, ¡te daré el Huevo más raro!", "accept": "¡Guau!¡Este combate promete!", - "decline": "Vaya, parece que tu equipo no está en condiciones óptimas.$Aquí, déjame ayudarte con eso." + "decline": "Vaya, parece que tu equipo no está en condiciones óptimas.$Venga, déjame ayudarte con eso." }, "cheryl": { "intro_dialogue": "Hola, me llamo Malta.$Tengo una petición particularmente interesante para un entrenador fuerte como tú.$Llevo conmigo dos Huevos Pokémon raros, pero me gustaría que alguien más cuidara uno.$Si puedes demostrarme tu fuerza como entrenador, ¡te daré el Huevo más raro!", "accept": "¡Espero que estés listo!", - "decline": "Entiendo, parece que tu equipo no está en las mejores condiciones en este momento.$Aquí, déjame ayudar con eso." + "decline": "Entiendo, parece que tu equipo no está en las mejores condiciones en este momento.$Déjame ayudar con eso." }, "marley": { "intro_dialogue": "...@d{64} Soy Sémola.$Tengo una oferta para ti...$Llevo conmigo dos Huevos Pokémon, pero me gustaría que alguien más cuidara uno.$Si eres más fuerte que yo, te daré el Huevo más raro.", @@ -18,12 +18,12 @@ "mira": { "intro_dialogue": "¡Hola! Soy Maiza. Maiza tiene una petición para un entrenador fuerte como tú. Maiza tiene dos Huevos Pokémon raros, pero quiere que alguien más se quede con uno. Si le demuestras a Maiza que eres fuerte,¡Maiza te dará el Huevo más raro!", "accept": "¿Vas a luchar contra Maiza?\n¡Genial!", - "decline": "Vaya, ¿no hay batalla? ¡Está bien! Aquí, Maiza curará a tu equipo." + "decline": "Vaya, ¿no hay batalla? ¡Está bien! Maiza curará a tu equipo." }, "riley": { "intro_dialogue": "Soy Quinoa.$Tengo una propuesta extraña para un entrenador fuerte como tú.$Llevo conmigo dos Huevos Pokémon raros, pero me gustaría darle uno a otro entrenador.$Si puedes demostrarme tu fuerza, te daré el Huevo más raro.", "accept": "Esa mirada que tienes...\nhagamos esto..", - "decline": "Entiendo, tu equipo parece agotado.$Aquí, déjame ayudarte con eso." + "decline": "Entiendo, tu equipo parece agotado.$A ver, déjame ayudarte con eso." }, "title": "Una Prueba de Entrenador", "description": "Parece que este entrenador está dispuesto a darte un Huevo sin importar tu decisión. Sin embargo, si logras derrotar a este entrenador fuerte, recibirás un Huevo mucho más raro.", @@ -31,7 +31,7 @@ "option": { "1": { "label": "Aceptar el Desafío", - "tooltip": "(-) Batalla Ardua\n(+) Obtén un @[TOOLTIP_TITLE]{Huevo muy raro}" + "tooltip": "(-) Batalla extremadamente Ardua\n(+) Obtén un @[TOOLTIP_TITLE]{Huevo muy raro}" }, "2": { "label": "Rechazar el Desafío", @@ -39,9 +39,9 @@ } }, "eggTypes": { - "rare": "un huevo Raro", - "epic": "un huavo Épico", - "legendary": "un huevo Legendario " + "rare": "un Huevo Raro", + "epic": "un Huevo Épico", + "legendary": "un Huevo Legendario " }, "outro": "{{statTrainerName}} te dio {{eggType}}!" } diff --git a/src/locales/es/mystery-encounters/absolute-avarice-dialogue.json b/src/locales/es/mystery-encounters/absolute-avarice-dialogue.json index f3700c1d60b..4d5b12ca086 100644 --- a/src/locales/es/mystery-encounters/absolute-avarice-dialogue.json +++ b/src/locales/es/mystery-encounters/absolute-avarice-dialogue.json @@ -17,9 +17,9 @@ "selected": "Tus súplicas conmueven al {{greedentName}}.$No te devuelve todas tus bayas, pero aún así te lanza algunas en tu dirección." }, "3": { - "label": "Déjalo quedarse con la comida", + "label": "Dejarle quedarse con la comida", "tooltip": "(-) Perder todas las bayas\n(?) Le gustarás al {{greedentName}}", "selected": "El {{greedentName}} devora todas sus bayas en un instante!$Acariciando su estómago, te mira con aprecio.$Quizás podrías darle más bayas en tu aventura....$@s{level_up_fanfare}El {{greedentName}} quiere unirse a tu equipo!" } } -} \ No newline at end of file +} diff --git a/src/locales/es/mystery-encounters/an-offer-you-cant-refuse-dialogue.json b/src/locales/es/mystery-encounters/an-offer-you-cant-refuse-dialogue.json index 07396cbc3b2..b0cd6ca6d43 100644 --- a/src/locales/es/mystery-encounters/an-offer-you-cant-refuse-dialogue.json +++ b/src/locales/es/mystery-encounters/an-offer-you-cant-refuse-dialogue.json @@ -1,7 +1,7 @@ { - "intro": "Te detiene un chico de aspecto rico.", + "intro": "Te detiene un chico con pinta de rico.", "speaker": "Niño Bien", - "intro_dialogue": "Buenos días a usted.$¡No puedo evitar notar que tu\n{{strongestPokemon}} se ve absolutamente divino!$¡Siempre he querido tener un Pokémon así!$¡Te pagaría generosamente,\n también te daría este viejo abalorio!", + "intro_dialogue": "¡Hola!$¡No puedo evitar notar que tu\n{{strongestPokemon}} se ve absolutamente divino!$Siempre he querido tener un Pokémon así, osea ¡me encanta!$¡Te pagaría generosamente,\n también te daría este viejo abalorio!", "title": "Una oferta que no puedes rechazar", "description": "Te están ofreciendo @[TOOLTIP_TITLE]{Amuleto Iris} y {{price, money}} por tu {{strongestPokemon}}!¡Es un trato extremadamente bueno, pero ¿realmente puedes soportar separarte de un miembro tan fuerte de tu equipo?", "query": "¿Qué harás?", @@ -12,7 +12,7 @@ "selected": "¡Maravilloso!@d{32} ¡Ven, John!, {{strongestPokemon}}!$¡Es hora de mostrarte a todos en el club náutico!$¡Estarán tan celosos!" }, "2": { - "label": "Extorsiona al niño", + "label": "Extorsionar al niño", "tooltip": "(+) {{option2PrimaryName}} usa {{moveOrAbility}}\n(+) Obtén {{price, money}}", "tooltip_disabled": "Tus Pokémon necesitan tener ciertos movimientos o habilidades para elegir esto", "selected": "¡Por Dios, nos están robando, {{liepardName}}!$¡Oirás de mis abogados por esto!" @@ -23,4 +23,4 @@ "selected": "Qué día más horrible…$Bueno, volvamos al club náutico entonces, {{liepardName}}." } } -} \ No newline at end of file +} diff --git a/src/locales/es/mystery-encounters/berries-abound-dialogue.json b/src/locales/es/mystery-encounters/berries-abound-dialogue.json index 4b9da99fbeb..c18a0a8e348 100644 --- a/src/locales/es/mystery-encounters/berries-abound-dialogue.json +++ b/src/locales/es/mystery-encounters/berries-abound-dialogue.json @@ -1,17 +1,17 @@ { "intro": "¡Hay un gran arbusto de bayas cerca de ese Pokémon!", "title": "Bayas Abundantes", - "description": "Parece que hay un Pokémon fuerte protegiendo un arbusto de bayas. Luchar es el enfoque directo, pero parece fuerte. ¿Quizás un Pokémon rápido podría agarrar algunas bayas sin ser descubierto?", + "description": "Parece que hay un Pokémon fuerte protegiendo un arbusto de bayas. Luchar es la opción más directa, pero parece fuerte. ¿Quizás un Pokémon rápido podría agarrar algunas bayas sin ser descubierto?", "query": "¿Qué harás?", "berries": "¡Bayas!", "option": { "1": { - "label": "Enfréntate al Pokémon", + "label": "Enfrentarse al Pokémon", "tooltip": "(-) Batalla Difícil\n(+) Obtén bayas", "selected": "Te acercas al\nPokémon sin miedo." }, "2": { - "label": "Corre hacia el arbusto", + "label": "Correr hacia el arbusto", "tooltip": "(-) {{fastestPokemon}} Utiliza su velocidad\n(+) Obtén bayas", "selected": "¡Tu {{fastestPokemon}} corre hacia el arbusto de bayas!$¡Logra agarrar {{numBerries}} antes de que {{enemyPokemon}} pueda reaccionar!$Huyes rápidamente con tu nuevo premio.", "selected_bad": "¡Tu {{fastestPokemon}} corre hacia el arbusto de bayas!$¡Oh no! ¡El {{enemyPokemon}} fue más rápido y bloqueó el camino!", @@ -23,4 +23,4 @@ "selected": "Dejas al Pokémon fuerte con su premio y continúas." } } -} \ No newline at end of file +} diff --git a/src/locales/es/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/es/mystery-encounters/bug-type-superfan-dialogue.json index 0fdc0995039..ab9b680e827 100644 --- a/src/locales/es/mystery-encounters/bug-type-superfan-dialogue.json +++ b/src/locales/es/mystery-encounters/bug-type-superfan-dialogue.json @@ -7,33 +7,33 @@ "query": "¿Qué harás?", "option": { "1": { - "label": "Proponer a luchar", - "tooltip": "(-) Batalla Desafiante\n(+) Enseña un movimiento de tipo Bicho a un Pokémon", + "label": "Proponerle luchar", + "tooltip": "(-) Batalla Desafiante\n(+) Enseña un movimiento de tipo Bicho a cualquier Pokémon", "selected": "¿Un desafío, eh?\n¡Mis Pokémon Bicho están más que preparados para ti!" }, "2": { - "label": "Muestra tus tipos Bicho", + "label": "Mostrar tus tipos Bicho", "tooltip": "(+) ¡Recibe un objeto de regalo!", "disabled_tooltip": "Necesitas al menos 1 Pokémon de tipo Bicho en tu equipo para seleccionar esto.", "selected": "Le muestras al entrenador todos tus Pokémon de tipo Bicho...", "selected_0_to_1": "¿Eh? Solo tienes {{numBugTypes}} tipo Bicho...$Supongo que estoy perdiendo el tiempo con alguien como tú...", "selected_2_to_3": "¡Oye, tienes {{numBugTypes}}! No está mal.$Aquí, esto podría ayudarte en tu viaje para atrapar más.", - "selected_4_to_5": "¿Qué? ¿Tienes {{numBugTypes}}?\nNice!$No estás a mi nivel, pero puedo ver destellos de mí en ti.$¡Toma esto, mi joven aprendiz!", + "selected_4_to_5": "¿Qué? ¿Tienes {{numBugTypes}}?\n¡Guau!$No estás a mi nivel, pero puedo ver un poco de mí reflejado en ti.$¡Toma esto, mi joven aprendiz!", "selected_6": "¡Vaya! {{numBugTypes}}!$¡Debes amar a los Pokémon de tipo Bicho casi tanto como yo!$Aquí, toma esto como un símbolo de nuestra camaradería." }, "3": { - "label": "Regala un objeto de tipo Bicho", + "label": "Regalar un objeto de tipo Bicho", "tooltip": "(-) Dale al entrenador un {{requiredBugItems}}\n(+) Recibe un item de regalo", "disabled_tooltip": "Necesitas tener un {{requiredBugItems}} para seleccionar esto.", "select_prompt": "Selecciona un objeto para dar", - "invalid_selection": "El Pokémon no tiene ese tipe de objeto.", + "invalid_selection": "El Pokémon no tiene ese tipo de objeto.", "selected": "Le entregas al entrenador un{{selectedItem}}.", "selected_dialogue": "¡Vaya! ¿Un {{selectedItem}}, para mí? ¡No eres tan malo, chico!$Como muestra de mi agradecimiento, quiero que tengas este regalo especial.$Ha pasado por toda mi familia, y ahora quiero que lo tengas tú." } }, "battle_won": "¡Tu conocimiento y habilidad fueron perfectos para explotar nuestras debilidades!$A cambio de la valiosa lección, permíteme enseñarle a uno de tus Pokémon un movimiento de tipo Bicho.", "teach_move_prompt": "Selecciona un movimiento para enseñar a un Pokémon.", - "confirm_no_teach": "¿Estás seguro de que no quieres aprender uno de estos excellentes movimientos?", + "confirm_no_teach": "¿Estás seguro de que no quieres aprender uno de estos excelentes movimientos?", "outro": "¡Veo grandes Pokémon de tipo Bicho en tu futuro! ¡Que nuestros caminos se crucen de nuevo! ¡Bicho fuera!", "numBugTypes_one": "{{count}} Pokémon de tipo Bicho", "numBugTypes_other": "{{count}} Pokémon de tipo Bicho" diff --git a/src/locales/es/mystery-encounters/clowning-around-dialogue.json b/src/locales/es/mystery-encounters/clowning-around-dialogue.json index 5199c8d6432..249b7e4cfbe 100644 --- a/src/locales/es/mystery-encounters/clowning-around-dialogue.json +++ b/src/locales/es/mystery-encounters/clowning-around-dialogue.json @@ -1,33 +1,34 @@ { "intro": "¿Es un...@d{64} payaso?", "speaker": "Payaso", - "intro_dialogue": "¡Bufón torpe, prepárate para una batalla brillante! ¡Serás derrotado por este trovador peleador!", - "description": "Algo no esta bien en este encuentro. El payaso parece ansioso por provocarte a una batalla, ¿pero con qué fin? El {{blacephalonName}} es especialmente extraño, como si tuviera @[TOOLTIP_TITLE]{tipos y habilidades raros.}", + "intro_dialogue": "¡Bufón inútil, prepárate para una batalla brillante! ¡Serás derrotado por este trovador luchador!", + "title": "Payaseando", + "description": "Algo no esta bien en este encuentro. El payaso parece ansioso por provocarte a pelear...pero, ¿con qué fin? El {{blacephalonName}} es especialmente extraño, como si tuviera @[TOOLTIP_TITLE]{tipos y habilidades raros.}", "query": "¿Qué harás?", "option": { "1": { "label": "Enfrentarse al Payaso", - "tooltip": "(-) Batalla extraña\n(?) Afecta las habilidades de los Pokémon", + "tooltip": "(-) Batalla extraña\n(?) Afecta la habilidad de un Pokémon", "selected": "¡Tus patéticos Pokémon están listos para una actuación patética!", - "apply_ability_dialogue": "¡Una exhibición sensacional! ¡Tu astucia se adapta a una habilidad sensacional como recompensa!", + "apply_ability_dialogue": "¡Una exhibición sensacional! ¡Tu astucia es digna de una habilidad especial como recompensa!", "apply_ability_message": "¡El payaso está ofreciendo intercambiar permanentemente la habilidad de uno de tus Pokémon por {{ability}}!", "ability_prompt": "¿Te gustaría enseñar permanentemente a un Pokémon la habilidad {{ability}}?", - "ability_gained": "¡@s{level_up_fanfare}{{chosenPokemon}} obtenió la habilidad {{ability}}!" + "ability_gained": "¡@s{level_up_fanfare}{{chosenPokemon}} obtuvo la habilidad {{ability}}!" }, "2": { "label": "No involucrarse", - "tooltip": "(-) Molesta al payaso\n(?) Afecta los objetos de los Pokémon", + "tooltip": "(?) Afecta los items de un Pokémon", "selected": "¡Cobarde desdichado, niegas un exquisito duelo?\n ¡Siente mi furia!", "selected_2": "¡El {{blacephalonName}} del payaso usa Truco! ¡Todos los objetos de tu {{switchPokemon}} fueron intercambiados al azar!", - "selected_3": "¡Tonto desconcertado, cae en mi engaño impecable!" + "selected_3": "¡Necio incompetente, serás víctima de mi trampa perfecta!" }, "3": { "label": "Devolver los insultos", - "tooltip": "(-) Molesta al payaso\n(?) Afecta los objetos de los Pokémon", + "tooltip": "(?) Afecta los tipos de tus Pokémon", "selected": "¡Cobarde desdichado, niegas un exquisito duelo?\n ¡Siente mi furia!", "selected_2": "¡El {{blacephalonName}} del payaso usa un movimiento extraño! ¡Todos los tipos de tu equipo fueron intercambiados al azar!", "selected_3": "¡Tonto desconcertado, cae en mi engaño impecable!" } }, "outro": "El payaso y sus secuaces\ndesaparecen en una nube de humo." -} \ No newline at end of file +} diff --git a/src/locales/es/mystery-encounters/dancing-lessons-dialogue.json b/src/locales/es/mystery-encounters/dancing-lessons-dialogue.json index c4494e3efa8..34358c1b754 100644 --- a/src/locales/es/mystery-encounters/dancing-lessons-dialogue.json +++ b/src/locales/es/mystery-encounters/dancing-lessons-dialogue.json @@ -11,12 +11,12 @@ "boss_enraged": "¡El miedo del {{oricorioName}} aumentó sus estadísticas!" }, "2": { - "label": "Aprende su danza", - "tooltip": "(+) Enseña a un Pokémon Danza despertar", + "label": "Aprender su danza", + "tooltip": "(+) Enseña a cualquier Pokémon Danza despertar", "selected": "Observas atentamente al {{oricorioName}} mientras realiza su danza…$@s{level_up_fanfare}¡Tu {{selectedPokemon}} aprendió del {{oricorioName}}!" }, "3": { - "label": "Muéstrale una danza", + "label": "Mostrarle una danza", "tooltip": "(-) Enseña al {{oricorioName}} un movimiento de danza\n(+) Le gustaras al {{oricorioName}}", "disabled_tooltip": "Tus Pokémon necesitan conocer un movimiento de danza para esto.", "select_prompt": "Selecciona un movimiento de tipo danza para usar.", @@ -24,4 +24,4 @@ } }, "invalid_selection": "Este Pokémon no conoce ningún movimiento de danza" -} \ No newline at end of file +} diff --git a/src/locales/es/mystery-encounters/field-trip-dialogue.json b/src/locales/es/mystery-encounters/field-trip-dialogue.json index be2554aba35..32416b98352 100644 --- a/src/locales/es/mystery-encounters/field-trip-dialogue.json +++ b/src/locales/es/mystery-encounters/field-trip-dialogue.json @@ -1,7 +1,7 @@ { - "intro": "¡Es un profesor y alugnos estudiantes parvulitos", - "speaker": "Profesor", - "intro_dialogue": "¡Hola! ¿Podrías dedicar un minuto a mis alumnos?$Les estoy enseñando sobre los movimientos de Pokémon\ny me encantaría mostrarles una demostración.$¿Te importaría mostrarnos uno de los movimientos\nque puede usar tu Pokémon?", + "intro": "¡Es una profesora y algunos estudiantes de parvulitos", + "speaker": "Profesora", + "intro_dialogue": "¡Hola! ¿Podrías dedicarles un minuto a mis alumnos?$Les estoy enseñando sobre los movimientos de Pokémon\ny me encantaría hacerles una demonstración. Te importaría enseñarnos uno de los movimientos\nque puede usar tu Pokémon?", "title": "Excursión", "description": "Una profesora está solicitando una demostración de un movimiento de un Pokémon. Dependiendo del movimiento que elijas, podría tener algo útil para ti a cambio.", "query": "¿Qué categoría de movimiento mostrarás?", @@ -28,4 +28,4 @@ "status": "Estado", "physical": "Físico", "special": "Especial" -} \ No newline at end of file +} diff --git a/src/locales/es/mystery-encounters/fun-and-games-dialogue.json b/src/locales/es/mystery-encounters/fun-and-games-dialogue.json index bbaa52996ad..709ed30673e 100644 --- a/src/locales/es/mystery-encounters/fun-and-games-dialogue.json +++ b/src/locales/es/mystery-encounters/fun-and-games-dialogue.json @@ -6,7 +6,7 @@ "query": "¿Te gustaría jugar?", "option": { "1": { - "label": "Jugar el juego", + "label": "Jugar", "tooltip": "(-) Paga {{option1Money, money}}\n(+) Juega al {{wobbuffetName}} Golpe-o-matic", "selected": "¡Es hora de probar tu suerte!" }, @@ -23,8 +23,8 @@ "turn_remaining_1": "¡Queda un turno!", "end_game": "¡Se acabó el tiempo!$El {{wobbuffetName}} se prepara para el contraataque y@d{16}.@d{16}.@d{16}.", "best_result": "¡El {{wobbuffetName}} golpea el botón con tanta fuerza\nque la campana se rompe!$¡Ganas el gran premio!", - "great_result": "¡El {{wobbuffetName}} golpea el botón, casi alcanzando la campana!$¡Tan cerca!\n¡Ganas el segundo premio!", + "great_result": "¡El {{wobbuffetName}} golpea el botón, casi alcanzando la campana!$¡Que pena!\n¡Ganas el segundo premio!", "good_result": "¡El {{wobbuffetName}} golpea el botón con suficiente fuerza para llegar a la mitad de la escala!$¡Ganas el tercer premio!", "bad_result": "El {{wobbuffetName}} apenas toca el botón y no pasa nada…$¡Oh no!\nNo ganas nada.", - "outro": "¡Ese fue un juego muy divertido!" -} \ No newline at end of file + "outro": "¡Eso estuvo muy divertido!" +} diff --git a/src/locales/es/party-ui-handler.json b/src/locales/es/party-ui-handler.json index 780ef633297..be51b19f0a3 100644 --- a/src/locales/es/party-ui-handler.json +++ b/src/locales/es/party-ui-handler.json @@ -14,10 +14,10 @@ "PASS_BATON": "Relevo", "UNPAUSE_EVOLUTION": "Reanudar evolución", "REVIVE": "Revivir", - "RENAME": "Rename", - "SELECT": "Select", + "RENAME": "Renombrar", + "SELECT": "Seleccionar", "choosePokemon": "Elige a un Pokémon.", - "doWhatWithThisPokemon": "¿Que quieres hacer con este Pokémon?", + "doWhatWithThisPokemon": "¿Qué quieres hacer con este Pokémon?", "noEnergy": "¡A {{pokemonName}} no le\nquedan fuerzas para luchar!", "hasEnergy": "¡A {{pokemonName}} le\nquedan fuerzas para luchar!", "cantBeUsed": "¡{{pokemonName}} no puede usarse en este desafío!", diff --git a/src/locales/es/trainer-classes.json b/src/locales/es/trainer-classes.json index 6a85e1bf83d..cc0469b36e5 100644 --- a/src/locales/es/trainer-classes.json +++ b/src/locales/es/trainer-classes.json @@ -127,7 +127,7 @@ "macro_grunt": "Entrenador Macrocosmos", "macro_grunt_female": "Entrenadora Macrocosmos", "macro_grunts": "Entrenadores Macrocosmos", - "star_grunt": "Star Grunt", - "star_grunt_female": "Star Grunt", - "star_grunts": "Star Grunts" + "star_grunt": "Recluta Star", + "star_grunt_female": "Recluta Star", + "star_grunts": "Recluta Star" } diff --git a/src/locales/es/trainer-names.json b/src/locales/es/trainer-names.json index adef8173687..14e31638d9c 100644 --- a/src/locales/es/trainer-names.json +++ b/src/locales/es/trainer-names.json @@ -169,16 +169,16 @@ "marnie_piers_double": "Roxy y Nerio", "piers_marnie_double": "Nerio y Roxy", - "buck": "Buck", - "cheryl": "Cheryl", - "marley": "Marley", - "mira": "Mira", - "riley": "Riley", + "buck": "Bulgur", + "cheryl": "Malta", + "marley": "Sémola", + "mira": "Maíza", + "riley": "Quinoa", "victor": "Victor", "victoria": "Victoria", "vivi": "Vivi", "vicky": "Vicky", "vito": "Vito", - "bug_type_superfan": "Bug-Type Superfan", - "expert_pokemon_breeder": "Expert Pokémon Breeder" + "bug_type_superfan": "Superfan de los Pokémon Bicho", + "expert_pokemon_breeder": "Criaokémon Experta" } diff --git a/src/locales/es/trainer-titles.json b/src/locales/es/trainer-titles.json index 34fef949e87..301f97a1bf3 100644 --- a/src/locales/es/trainer-titles.json +++ b/src/locales/es/trainer-titles.json @@ -19,7 +19,7 @@ "aether_boss": "Presidente Æther", "skull_boss": "Jefe del Team Skull", "macro_boss": "Presidente de Macrocosmos", - "star_boss": "Team Star Leader", + "star_boss": "Jefe del Team Star", "rocket_admin": "Admin. del Team Rocket", "rocket_admin_female": "Admin. del Team Rocket", @@ -36,7 +36,7 @@ "aether_admin": "Director de la Fundación Æther", "skull_admin": "Admin. del Team Skull", "macro_admin": "Admin. de Macrocosmos", - "star_admin": "Team Star Squad Boss", + "star_admin": "Admin. del Team Star", "the_winstrates": "Familia Estratega" } From 906e2e3cc4db673f6e3a3a0cbce7c03736727526 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Wed, 25 Sep 2024 18:28:58 +0200 Subject: [PATCH 09/18] [Localization] ME translations - The sequel (#4396) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Fixed 'pack' to 'flock' * Apply suggestions from code review Co-authored-by: Chapybara-jp * Update fun-and-games-dialogue.json * Update berries-abound-dialogue.json * Update berries-abound-dialogue.json * Update berries-abound-dialogue.json * Update berries-abound-dialogue.json * Update berries-abound-dialogue.json * Translate global-trade-system-dialogue.json * Update global-trade-system-dialogue.json * Update global-trade-system-dialogue.json * Update fiery-fallout-dialogue.json * Update lost-at-sea-dialogue.json * Update mysterious-challengers-dialogue.json * Update lost-at-sea-dialogue.json * Update mysterious-chest-dialogue.json * Update part-timer-dialogue.json * Update safari-zone-dialogue.json * Update safari-zone-dialogue.json * Update shady-vitamin-dealer-dialogue.json * Update slumbering-snorlax-dialogue.json * Update teleporting-hijinks-dialogue.json * Update a-trainers-test-dialogue.json * Update clowning-around-dialogue.json * Update global-trade-system-dialogue.json * Update safari-zone-dialogue.json * Update the-expert-pokemon-breeder-dialogue.json * Update the-pokemon-salesman-dialogue.json * Update the-strong-stuff-dialogue.json * Update the-winstrate-challenge-dialogue.json * Update training-session-dialogue.json * Update trash-to-treasure-dialogue.json * Update a-trainers-test-dialogue.json * Update a-trainers-test-dialogue.json * Update bug-type-superfan-dialogue.json * Update clowning-around-dialogue.json * Update dancing-lessons-dialogue.json * Update delibirdy-dialogue.json * Update global-trade-system-dialogue.json * Update safari-zone-dialogue.json * Update the-expert-pokemon-breeder-dialogue.json * Update the-pokemon-salesman-dialogue.json * Update the-strong-stuff-dialogue.json * Update the-winstrate-challenge-dialogue.json * Update training-session-dialogue.json * Update trash-to-treasure-dialogue.json * Update a-trainers-test-dialogue.json * Add files via upload * Add files via upload * Add files via upload * Update mystery-encounter-messages.json * Update clowning-around-dialogue.json * Update safari-zone-dialogue.json * Update the-expert-pokemon-breeder-dialogue.json * Update the-pokemon-salesman-dialogue.json * Update a-trainers-test-dialogue.json * Update bug-type-superfan-dialogue.json * Update clowning-around-dialogue.json * Update clowning-around-dialogue.json * Update dancing-lessons-dialogue.json * Update global-trade-system-dialogue.json * Update mysterious-chest-dialogue.json * Update safari-zone-dialogue.json * Update teleporting-hijinks-dialogue.json * Update the-expert-pokemon-breeder-dialogue.json * Update the-pokemon-salesman-dialogue.json * Update the-pokemon-salesman-dialogue.json * Update the-expert-pokemon-breeder-dialogue.json * Update training-session-dialogue.json * Update trash-to-treasure-dialogue.json * Update the-strong-stuff-dialogue.json * Update the-winstrate-challenge-dialogue.json * Update training-session-dialogue.json * Apply suggestions from code review Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update trash-to-treasure-dialogue.json * Update the-winstrate-challenge-dialogue.json * Update mysterious-chest-dialogue.json * Term synchronization( 전투 -> 배틀 ) * added "Extremely" * Reflected new scripts * modified by new-script * added "special" and "imporved" * fix hard coded -> @[TOOLTIP_TITLE]{{{numEncounters}} * added last brace * added tooltip_title * added tooltip_title * modified by new script * updated portuguese MEs * modified by new script * added tooltip, made description exactly * modifed by new script * fixed hardcorded {{costMultiplier}} * Change titles like no problem * Update a-trainers-test-dialogue.json * Update absolute-avarice-dialogue.json * Update a-trainers-test-dialogue.json * Update trainer-names.json * Update menu.json * Update modifier-type.json * Apply suggestions from @returntoice thanks Co-authored-by: returntoice <171243264+returntoice@users.noreply.github.com> * Update clowning-around-dialogue.json * Update a-trainers-test-dialogue.json * Update a-trainers-test-dialogue.json * Update absolute-avarice-dialogue.json * Update an-offer-you-cant-refuse-dialogue.json * Update berries-abound-dialogue.json * Update bug-type-superfan-dialogue.json * Update clowning-around-dialogue.json * Update dancing-lessons-dialogue.json * Update field-trip-dialogue.json * Update fun-and-games-dialogue.json * Add files via upload * Update clowning-around-dialogue.json --------- Co-authored-by: frutescens Co-authored-by: Chapybara-jp Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: sodamelon Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> Co-authored-by: returntoice <171243264+returntoice@users.noreply.github.com> --- src/locales/ca_ES/menu.json | 2 +- .../a-trainers-test-dialogue.json | 2 +- .../berries-abound-dialogue.json | 4 +- .../clowning-around-dialogue.json | 10 ++-- .../dancing-lessons-dialogue.json | 2 +- .../delibirdy-dialogue.json | 2 +- .../global-trade-system-dialogue.json | 6 +-- .../safari-zone-dialogue.json | 4 +- .../the-expert-pokemon-breeder-dialogue.json | 2 +- .../the-pokemon-salesman-dialogue.json | 6 +-- .../the-strong-stuff-dialogue.json | 2 +- .../the-winstrate-challenge-dialogue.json | 6 +-- .../training-session-dialogue.json | 4 +- .../trash-to-treasure-dialogue.json | 2 +- .../berries-abound-dialogue.json | 4 +- src/locales/fr/modifier-type.json | 2 +- .../a-trainers-test-dialogue.json | 2 +- .../clowning-around-dialogue.json | 6 +-- .../global-trade-system-dialogue.json | 4 +- .../mysterious-chest-dialogue.json | 2 +- .../safari-zone-dialogue.json | 2 +- .../the-expert-pokemon-breeder-dialogue.json | 2 +- .../the-pokemon-salesman-dialogue.json | 4 +- .../the-strong-stuff-dialogue.json | 2 +- .../the-winstrate-challenge-dialogue.json | 4 +- .../training-session-dialogue.json | 8 ++-- .../trash-to-treasure-dialogue.json | 2 +- .../a-trainers-test-dialogue.json | 48 ++++++++++++++++++- .../absolute-avarice-dialogue.json | 2 +- src/locales/it/trainer-names.json | 2 +- .../a-trainers-test-dialogue.json | 2 +- .../bug-type-superfan-dialogue.json | 2 +- .../clowning-around-dialogue.json | 8 ++-- .../dancing-lessons-dialogue.json | 4 +- .../fiery-fallout-dialogue.json | 27 ++++++++++- .../fight-or-flight-dialogue.json | 26 +++++++++- .../fun-and-games-dialogue.json | 31 +++++++++++- .../global-trade-system-dialogue.json | 33 ++++++++++++- .../lost-at-sea-dialogue.json | 29 ++++++++++- .../mysterious-challengers-dialogue.json | 23 ++++++++- .../mysterious-chest-dialogue.json | 24 +++++++++- .../part-timer-dialogue.json | 32 ++++++++++++- .../safari-zone-dialogue.json | 47 +++++++++++++++++- .../shady-vitamin-dealer-dialogue.json | 28 ++++++++++- .../slumbering-snorlax-dialogue.json | 26 +++++++++- .../teleporting-hijinks-dialogue.json | 28 ++++++++++- .../the-expert-pokemon-breeder-dialogue.json | 32 ++++++++++++- .../the-pokemon-salesman-dialogue.json | 24 +++++++++- .../the-strong-stuff-dialogue.json | 22 ++++++++- .../the-winstrate-challenge-dialogue.json | 23 ++++++++- .../training-session-dialogue.json | 34 ++++++++++++- .../trash-to-treasure-dialogue.json | 20 +++++++- .../a-trainers-test-dialogue.json | 2 +- .../clowning-around-dialogue.json | 10 ++-- .../dancing-lessons-dialogue.json | 4 +- .../global-trade-system-dialogue.json | 4 +- .../safari-zone-dialogue.json | 2 +- .../the-expert-pokemon-breeder-dialogue.json | 2 +- .../the-pokemon-salesman-dialogue.json | 4 +- .../the-strong-stuff-dialogue.json | 2 +- .../the-winstrate-challenge-dialogue.json | 6 +-- .../training-session-dialogue.json | 8 ++-- .../trash-to-treasure-dialogue.json | 2 +- .../a-trainers-test-dialogue.json | 2 +- .../berries-abound-dialogue.json | 2 +- .../bug-type-superfan-dialogue.json | 2 +- .../clowning-around-dialogue.json | 10 ++-- .../dancing-lessons-dialogue.json | 4 +- .../global-trade-system-dialogue.json | 4 +- .../safari-zone-dialogue.json | 2 +- .../the-expert-pokemon-breeder-dialogue.json | 2 +- .../the-pokemon-salesman-dialogue.json | 4 +- .../the-strong-stuff-dialogue.json | 2 +- .../the-winstrate-challenge-dialogue.json | 4 +- .../training-session-dialogue.json | 8 ++-- .../trash-to-treasure-dialogue.json | 4 +- 76 files changed, 645 insertions(+), 126 deletions(-) diff --git a/src/locales/ca_ES/menu.json b/src/locales/ca_ES/menu.json index 42b0847b2f2..8935a075c49 100644 --- a/src/locales/ca_ES/menu.json +++ b/src/locales/ca_ES/menu.json @@ -43,7 +43,7 @@ "loading": "Carregant…", "loadingAsset": "Carregant actius: {{assetName}}", "playersOnline": "Jugadors en Línia", - "yes":"sí", + "yes":"Sí", "no":"No", "disclaimer": "AVÍS", "disclaimerDescription": "Aquest joc encara no s'ha completat; podríeu tenir problemes de joc (inclosa la possible pèrdua de dades desades),\n el joc pot canviar sense previ avís, i el joc es pot actualitzar o completar o no.", diff --git a/src/locales/de/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/de/mystery-encounters/a-trainers-test-dialogue.json index 50413e24bc2..6ed291d7c7e 100644 --- a/src/locales/de/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/de/mystery-encounters/a-trainers-test-dialogue.json @@ -31,7 +31,7 @@ "option": { "1": { "label": "Die Herausforderung annehmen", - "tooltip": "(-) Schwerer Kampf\n(+) Erhalte ein @[TOOLTIP_TITLE]{Sehr seltenes Ei}" + "tooltip": "(-) Sehr schwerer Kampf\n(+) Erhalte ein @[TOOLTIP_TITLE]{Sehr seltenes Ei}" }, "2": { "label": "Die Herausforderung ablehnen", diff --git a/src/locales/de/mystery-encounters/berries-abound-dialogue.json b/src/locales/de/mystery-encounters/berries-abound-dialogue.json index e7ff57a32ef..74384e60688 100644 --- a/src/locales/de/mystery-encounters/berries-abound-dialogue.json +++ b/src/locales/de/mystery-encounters/berries-abound-dialogue.json @@ -3,7 +3,7 @@ "title": "Überall Beeren", "description": "Es scheint, als ob ein starkes Pokémon einen Beerenstrauch bewacht. Ein Kampf wäre der direkte Weg, aber es sieht stark aus. Vielleicht könnte ein schnelles Pokémon ein paar Beeren schnappen, ohne erwischt zu werden?", "query": "Was wirst du tun?", - "berries": "Berren!", + "berries": "Berren", "option": { "1": { "label": "Kampf beginnen", @@ -23,4 +23,4 @@ "selected": "Du lässt das starke Pokémon mit seinem Item zurück und gehst weiter." } } -} \ No newline at end of file +} diff --git a/src/locales/de/mystery-encounters/clowning-around-dialogue.json b/src/locales/de/mystery-encounters/clowning-around-dialogue.json index 5dce7b515a9..726dc2581aa 100644 --- a/src/locales/de/mystery-encounters/clowning-around-dialogue.json +++ b/src/locales/de/mystery-encounters/clowning-around-dialogue.json @@ -8,23 +8,23 @@ "option": { "1": { "label": "Kampf beginnen", - "tooltip": "(-) Komischer Kampf\n(?) Beeinflusst Pokémon-Fähigkeiten", + "tooltip": "(-) Komischer Kampf\n(?) Beeinflusst die Fähigkeit eines Pokémon", "selected": "Deine erbärmlichen Pokémon sind bereit für eine erbärmliche Vorstellung!", - "apply_ability_dialogue": "Eine sensationelle Vorstellung! Dein Können passt zu einer sensationellen Fähigkeit als Beute!", + "apply_ability_dialogue": "Eine sensationelle Vorstellung! Dein Können passt zu einer besonderen Fähigkeit als Beute!", "apply_ability_message": "Der Clown bietet an, die Fähigkeit eines deiner Pokémon dauerhaft auf {{ability}} zu wechseln!", "ability_prompt": "Soll eines deiner Pokémon die Fähigkeit {{ability}} dauerhaft erlangen?", "ability_gained": "@s{level_up_fanfare}{{chosenPokemon}} hat die Fähigkeit {{ability}} erhalten!" }, "2": { "label": "Nicht provozieren lassen", - "tooltip": "(-) Der Clown ist beleidigt\n(?) Beeinflusst Pokémon-Items", + "tooltip": "(?) Beeinflusst die Items eines Pokémons", "selected": "Du erbärmlicher Feigling, du verweigerst einen wunderbaren Kampf? Fühle meinen Zorn!", "selected_2": "Das {{blacephalonName}} des Clowns verwendet Trickbetrug! Alle Items deines {{switchPokemon}} wurden zufällig vertauscht!", "selected_3": "Meine perfekte List hat dich in die Irre geführt!" }, "3": { "label": "Die Beleidigungen erwidern", - "tooltip": "(-) Den Clown verärgern\n(?) Beeinflusst Pokémon-Typen", + "tooltip": "(?) Beeinflusst die Typen deiner Pokémon", "selected": "Du erbärmlicher Feigling verweigerst einen wunderbaren Kampf? Fühle meinen Zorn!", "selected_2": "Das {{blacephalonName}} des Clowns verwendet eine seltsame Attacke! Alle Typen deines Teams wurden zufällig vertauscht!", "selected_3": "Meine perfekte List hat dich in die Irre geführt!" @@ -32,4 +32,4 @@ }, "outro": "Der Clown und seine Kumpanen verschwinden in einer Rauchwolke." -} \ No newline at end of file +} diff --git a/src/locales/de/mystery-encounters/dancing-lessons-dialogue.json b/src/locales/de/mystery-encounters/dancing-lessons-dialogue.json index 3ea02955309..33c4b395cd3 100644 --- a/src/locales/de/mystery-encounters/dancing-lessons-dialogue.json +++ b/src/locales/de/mystery-encounters/dancing-lessons-dialogue.json @@ -24,4 +24,4 @@ } }, "invalid_selection": "Das Pokémon kennt keine Tanzattacke" -} \ No newline at end of file +} diff --git a/src/locales/de/mystery-encounters/delibirdy-dialogue.json b/src/locales/de/mystery-encounters/delibirdy-dialogue.json index 34ca9666d09..8d0602ed3d0 100644 --- a/src/locales/de/mystery-encounters/delibirdy-dialogue.json +++ b/src/locales/de/mystery-encounters/delibirdy-dialogue.json @@ -26,4 +26,4 @@ } }, "outro": "Die {{delibirdName}} watscheln glücklich davon.$Was für ein seltsamer kleiner Austausch!" -} \ No newline at end of file +} diff --git a/src/locales/de/mystery-encounters/global-trade-system-dialogue.json b/src/locales/de/mystery-encounters/global-trade-system-dialogue.json index f9b2ac605bf..52f5881a218 100644 --- a/src/locales/de/mystery-encounters/global-trade-system-dialogue.json +++ b/src/locales/de/mystery-encounters/global-trade-system-dialogue.json @@ -11,13 +11,13 @@ }, "2": { "label": "Zaubertausch", - "tooltip": "(+) Seine eine deiner Pokémon an die GTS und erhalte ein zufälliges Pokémon im Austausch" + "tooltip": "(+) Seine eine deiner Pokémon an die GTS und erhalte ein zufälliges besonderes Pokémon im Austausch" }, "3": { "label": "Tausche ein Item", "trade_options_prompt": "Wähle ein Item aus, das du senden möchtest.", "invalid_selection": "Dieses Pokémon hat keine Items die getauscht werden können.", - "tooltip": "(+) Sende eines deiner Items an die GTS und erhalte ein zufälliges Item im Austausch" + "tooltip": "(+) Sende eines deiner Items an die GTS und erhalte ein zufälliges verbessertes Item im Austausch" }, "4": { "label": "Weggehen", @@ -29,4 +29,4 @@ "pokemon_trade_goodbye": "Machs gut, {{tradedPokemon}}!", "item_trade_selected": "{{chosenItem}} wird an {{tradeTrainerName}} gesendet.$.@d{64}.@d{64}.@d{64}\n@s{level_up_fanfare}Tausch abgeschlossen!$Du hast {{itemName}} von {{tradeTrainerName}} erhalten!", "trade_received": "@s{evolution_fanfare}{{tradeTrainerName}} hat dir {{received}} geschickt!" -} \ No newline at end of file +} diff --git a/src/locales/de/mystery-encounters/safari-zone-dialogue.json b/src/locales/de/mystery-encounters/safari-zone-dialogue.json index 2302833036b..6ae24c70d74 100644 --- a/src/locales/de/mystery-encounters/safari-zone-dialogue.json +++ b/src/locales/de/mystery-encounters/safari-zone-dialogue.json @@ -1,7 +1,7 @@ { "intro": "Es ist die Safari-Zone!", "title": "Die Safari-Zone", - "description": "Es gibt alle Arten von seltenen und besonderen Pokémon, die hier gefunden werden können!\nWenn du dich entscheidest, einzutreten, hast du kannst du in den nächsten 3 Wellen versuchen, besondere Pokémon zu fangen.\nAber sei gewarnt, diese Pokémon können fliehen, bevor du sie fangen kannst!", + "description": "Es gibt alle Arten von seltenen und besonderen Pokémon, die hier gefunden werden können!\nWenn du dich entscheidest, einzutreten, hast du kannst du in den nächsten @[TOOLTIP_TITLE]{{{numEncounters}} Wellen} versuchen, besondere Pokémon zu fangen.\nAber sei gewarnt, diese Pokémon können fliehen, bevor du sie fangen kannst!", "query": "Willst du eintreten?", "option": { "1": { @@ -43,4 +43,4 @@ "remaining_count": "{{remainingCount}} Pokémon übrig!" }, "outro": "Das war ein spannendes Abenteuer in der Safari-Zone!" -} \ No newline at end of file +} diff --git a/src/locales/de/mystery-encounters/the-expert-pokemon-breeder-dialogue.json b/src/locales/de/mystery-encounters/the-expert-pokemon-breeder-dialogue.json index d2fcc91d153..191fdaaf783 100644 --- a/src/locales/de/mystery-encounters/the-expert-pokemon-breeder-dialogue.json +++ b/src/locales/de/mystery-encounters/the-expert-pokemon-breeder-dialogue.json @@ -25,7 +25,7 @@ "outro": "Schau wie glücklich dein {{chosenPokemon}} nun ist!$Hier, diese Pokémon-Eier kannst du auch haben.", "outro_failed": "Wie enttäuschend...$Es sieht so aus, als hättest du noch einen langen Weg vor dir, um das Vertrauen deines Pokémon zu gewinnen!", "gained_eggs": "@s{item_fanfare}Du erhählst {{numEggs}}!", - "eggs_tooltip": "\n(+) Erhalte {{eggs}}", + "eggs_tooltip": "\n(+) Erhalte @[TOOLTIP_TITLE]{{{eggs}}}", "numEggs_one": "{{count}} Ei der Stufe {{rarity}}", "numEggs_other": "{{count}} Eier der Stufe {{rarity}}" } diff --git a/src/locales/de/mystery-encounters/the-pokemon-salesman-dialogue.json b/src/locales/de/mystery-encounters/the-pokemon-salesman-dialogue.json index 1e055fa5ed0..2f4db0db893 100644 --- a/src/locales/de/mystery-encounters/the-pokemon-salesman-dialogue.json +++ b/src/locales/de/mystery-encounters/the-pokemon-salesman-dialogue.json @@ -3,8 +3,8 @@ "speaker": "Reicher Mann", "intro_dialogue": "Hallo! Ich habe ein Angebot, das du nicht ablehnen kannst!", "title": "Der Pokémon-Verkäufer", - "description": "Dieses {{purchasePokemon}} ist extrem einzigartig und hat eine Fähigkeit, die normalerweise nicht bei seiner Art zu finden ist! Ich lasse dich dieses tolle {{purchasePokemon}} für gerade einmal {{price, money}} haben!\"\n\"Was sagst du dazu?\"", - "description_shiny": "Dieses {{purchasePokemon}} ist extrem einzigartig und hat eine Farbe, die normalerweise nicht bei seiner Art zu finden ist! Ich lasse dich dieses tolle {{purchasePokemon}} für gerade einmal {{price, money}} haben!\"\n\"Was sagst du dazu?\"", + "description": "Dieses {{purchasePokemon}} ist extrem einzigartig und @[TOOLTIP_TITLE]{hat eine Fähigkeit, die normalerweise nicht bei seiner Art zu finden ist}! Ich lasse dich dieses tolle {{purchasePokemon}} für gerade einmal {{price, money}} haben!\"\n\"Was sagst du dazu?\"", + "description_shiny": "Dieses {{purchasePokemon}} ist extrem einzigartig und @[TOOLTIP_TITLE]{hat eine Farbe, die normalerweise nicht bei seiner Art zu finden ist}! Ich lasse dich dieses tolle {{purchasePokemon}} für gerade einmal {{price, money}} haben!\"\n\"Was sagst du dazu?\"", "query": "Was wirst du tun?", "option": { "1": { @@ -20,4 +20,4 @@ "selected": "Nein?@d{32} Du sagst nein?$Ich mache das nur als Gefallen für dich!" } } -} \ No newline at end of file +} diff --git a/src/locales/de/mystery-encounters/the-strong-stuff-dialogue.json b/src/locales/de/mystery-encounters/the-strong-stuff-dialogue.json index 0fd1a7ad64f..c03dc3cd1d6 100644 --- a/src/locales/de/mystery-encounters/the-strong-stuff-dialogue.json +++ b/src/locales/de/mystery-encounters/the-strong-stuff-dialogue.json @@ -18,4 +18,4 @@ } }, "outro": "Was ist hier gerade passiert?" -} \ No newline at end of file +} diff --git a/src/locales/de/mystery-encounters/the-winstrate-challenge-dialogue.json b/src/locales/de/mystery-encounters/the-winstrate-challenge-dialogue.json index e3d0dddd21a..7e9b52247a8 100644 --- a/src/locales/de/mystery-encounters/the-winstrate-challenge-dialogue.json +++ b/src/locales/de/mystery-encounters/the-winstrate-challenge-dialogue.json @@ -3,12 +3,12 @@ "speaker": "Die Sihgers", "intro_dialogue": "Wir sind die Sihgers!$Wie wäre es, wenn du gegen unsere Familie in einer Reihe von Pokémon-Kämpfen antrittst?", "title": "Die Sihgers-Herausforderung", - "description": "Die Sihgers sind eine Familie von 5 Trainern, und sie wollen kämpfen! Wenn du sie alle hintereinander besiegst, bekommst du einen grandiosen Preis. Aber kannst du die Hitze aushalten?", + "description": "Die Sihgers sind eine Familie von @[TOOLTIP_TITLE]{5 Trainern}, und sie wollen kämpfen! Wenn du sie alle hintereinander besiegst, bekommst du einen grandiosen Preis. Aber kannst du die Hitze aushalten?", "query": "Was wirst du tun?", "option": { "1": { "label": "Die Herausforderung annehmen", - "tooltip": "(-) Brutaler Kampf\n(+) Spezielle Belohnung", + "tooltip": "(-) Brutaler Kampf gegen 5 Trainer\n(+) Spezielle Belohnung", "selected": "Lass die Herausforderung beginnen!" }, "2": { @@ -19,4 +19,4 @@ }, "victory": "Glückwunsch, du hast unsere Herausforderung gemeistert!$Zuerst möchten wir dir diesen Gutschein geben.", "victory_2": "Außerdem benutzt unsere Familie diese Machoschiene, um unsere Pokémon effektiver zu tranieren.$Du brauchst es vielleicht nicht, da du uns alle geschlagen hast, aber wir hoffen, dass du es trotzdem annimmst!" -} \ No newline at end of file +} diff --git a/src/locales/de/mystery-encounters/training-session-dialogue.json b/src/locales/de/mystery-encounters/training-session-dialogue.json index f7d22ef6deb..2fe6aa98663 100644 --- a/src/locales/de/mystery-encounters/training-session-dialogue.json +++ b/src/locales/de/mystery-encounters/training-session-dialogue.json @@ -1,7 +1,7 @@ { "intro": "Du stolperst über einige Trainingsutensilien und Vorräte.", "title": "Traningssitzung", - "description": "Diese Vorräte sehen so aus, als könnten sie verwendet werden, um ein Mitglied deines Teams zu trainieren! Es gibt ein paar Möglichkeiten, wie du dein Pokémon trainieren könntest, indem du gegen es mit dem Rest deines Teams kämpfst.", + "description": "Diese Vorräte sehen so aus, als könnten sie verwendet werden, um ein Mitglied deines Teams zu trainieren! Es gibt ein paar Möglichkeiten, wie du dein Pokémon trainieren könntest, indem du gegen es mit dem Rest deines Teams @[TOOLTIP_TITLE]{kämpfst und es besiegst}.", "query": "Wie möchtest du trainieren?", "invalid_selection": "Pokémon muss genügend KP haben.", "option": { @@ -30,4 +30,4 @@ "selected": "{{selectedPokemon}} bewegt sich über die Lichtung, um dir gegenüberzutreten..." }, "outro": "Das war eine erfolgreiche Trainingssitzung!" -} \ No newline at end of file +} diff --git a/src/locales/de/mystery-encounters/trash-to-treasure-dialogue.json b/src/locales/de/mystery-encounters/trash-to-treasure-dialogue.json index da744ccb697..a5170231d40 100644 --- a/src/locales/de/mystery-encounters/trash-to-treasure-dialogue.json +++ b/src/locales/de/mystery-encounters/trash-to-treasure-dialogue.json @@ -6,7 +6,7 @@ "option": { "1": { "label": "Nach Wertsachen suchen", - "tooltip": "(-) Heilitems kosten ab jetzt das Dreifache\n(+) Erhalte tolle Items", + "tooltip": "(-) Heilitems kosten ab jetzt {{costMultiplier}} mal so viel\n(+) Erhalte tolle Items", "selected": "Du arbeitest dich durch den Müllhaufen und wirst von Dreck überzogen.$Kein respektabler Ladenbesitzer wird dir in deinem schmutzigen Zustand etwas verkaufen!$Aber es gibt ja auch andere... weniger respektable.$Natürlich verlangen sie höhere Preise.$Aber du hast einige unglaubliche Items im Müll gefunden!" }, diff --git a/src/locales/en/mystery-encounters/berries-abound-dialogue.json b/src/locales/en/mystery-encounters/berries-abound-dialogue.json index 26eae2c6b88..92b3af5557b 100644 --- a/src/locales/en/mystery-encounters/berries-abound-dialogue.json +++ b/src/locales/en/mystery-encounters/berries-abound-dialogue.json @@ -3,7 +3,7 @@ "title": "Berries Abound", "description": "It looks like there's a strong Pokémon guarding a berry bush. Battling is the straightforward approach, but it looks strong. Perhaps a fast Pokémon could grab some berries without getting caught?", "query": "What will you do?", - "berries": "Berries!", + "berries": "Berries", "option": { "1": { "label": "Battle the Pokémon", @@ -23,4 +23,4 @@ "selected": "You leave the strong Pokémon\nwith its prize and continue on." } } -} \ No newline at end of file +} diff --git a/src/locales/fr/modifier-type.json b/src/locales/fr/modifier-type.json index a4bd7cabe3c..74c7599fea7 100644 --- a/src/locales/fr/modifier-type.json +++ b/src/locales/fr/modifier-type.json @@ -240,7 +240,7 @@ "TOXIC_ORB": { "name": "Orbe Toxique", "description": "Empoisonne gravement son porteur à la fin du tour s’il n’a pas déjà de problème de statut." }, "FLAME_ORB": { "name": "Orbe Flamme", "description": "Brule son porteur à la fin du tour s’il n’a pas déjà de problème de statut." }, - "BATON": { "name": "Bâton", "description": "Permet de transmettre les effets en cas de changement de Pokémon. Ignore les pièges." }, + "BATON": { "name": "Témoin", "description": "Permet de transmettre les effets en cas de changement de Pokémon. Ignore les pièges." }, "SHINY_CHARM": { "name": "Charme Chroma", "description": "Augmente énormément les chances de rencontrer un Pokémon sauvage chromatique." }, "ABILITY_CHARM": { "name": "Charme Talent", "description": "Augmente énormément les chances de rencontrer un Pokémon sauvage avec un talent caché." }, diff --git a/src/locales/fr/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/fr/mystery-encounters/a-trainers-test-dialogue.json index 6040e0c4cbb..1cf7be41631 100644 --- a/src/locales/fr/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/fr/mystery-encounters/a-trainers-test-dialogue.json @@ -31,7 +31,7 @@ "option": { "1": { "label": "Accepter le défi", - "tooltip": "(-) Combat difficile\n(+) Gain d’un @[TOOLTIP_TITLE]{Œuf très rare}" + "tooltip": "(-) Combat extrême\n(+) Gain d’un @[TOOLTIP_TITLE]{Œuf très rare}" }, "2": { "label": "Décliner le défi", diff --git a/src/locales/fr/mystery-encounters/clowning-around-dialogue.json b/src/locales/fr/mystery-encounters/clowning-around-dialogue.json index 83329153ff3..dbd7589b8e7 100644 --- a/src/locales/fr/mystery-encounters/clowning-around-dialogue.json +++ b/src/locales/fr/mystery-encounters/clowning-around-dialogue.json @@ -8,7 +8,7 @@ "option": { "1": { "label": "Affronter le Clown", - "tooltip": "(-) Combat étrange\n(?) Affecte les talents des Pokémon", + "tooltip": "(-) Combat étrange\n(?) Affecte le talent d’un Pokémon", "selected": "Vos Pokémon sont prêts pour cette performance pathétique !", "apply_ability_dialogue": "Un spectacle sensationnel !\nVotre savoir-faire est en harmonie avec vos compétences !", "apply_ability_message": "Le Clown vous propose d’Échanger définitivement le talent d’un de vos Pokémon contre {{ability}} !", @@ -17,14 +17,14 @@ }, "2": { "label": "Rester de marbre", - "tooltip": "(-) Agace le Clown\n(?) Affecte les objets de vos Pokémon", + "tooltip": "(?) Affecte les objets d’un Pokémon", "selected": "Ça se défile lâchement d’un duel exceptionnel ?\nDans ce cas, tâte à ma colère !", "selected_2": "Le {{blacephalonName}} du Clown utilise\nTour de Magie !$Tous les objets de {{switchPokemon}}\nsont échangés au hasard !", "selected_3": "Sombre imbécile, tombe dans mon piège !" }, "3": { "label": "Retourner les insultes", - "tooltip": "(-) Agace le Clown\n(?) Affecte les types de vos Pokémon", + "tooltip": "(?) Affecte les types de vos Pokémon", "selected": "Ça se défile lâchement d’un duel exceptionnel ?\nDans ce cas, tâte à ma colère !", "selected_2": "Le {{blacephalonName}} du Clown utilise\nune étrange capacité !$Tous les types de votre équipe\nsont échangés au hasard !", "selected_3": "Sombre imbécile, tombe dans mon piège !" diff --git a/src/locales/fr/mystery-encounters/global-trade-system-dialogue.json b/src/locales/fr/mystery-encounters/global-trade-system-dialogue.json index 6caafc3c82d..c392756f72a 100644 --- a/src/locales/fr/mystery-encounters/global-trade-system-dialogue.json +++ b/src/locales/fr/mystery-encounters/global-trade-system-dialogue.json @@ -11,13 +11,13 @@ }, "2": { "label": "Échange Miracle", - "tooltip": "(+) Envoyer un de vos Pokémon à la GTS et en recevoir un au hasard" + "tooltip": "(+) Envoyer un de vos Pokémon à la GTS et en recevoir un spécial au hasard" }, "3": { "label": "Échanger un objet", "trade_options_prompt": "Choisissez l’objet à envoyer.", "invalid_selection": "Ce Pokémon n’a aucun objet légal à échanger.", - "tooltip": "(+) Envoyer un de vos objets à la GTS et en recevoir un au hasard" + "tooltip": "(+) Envoyer un de vos objets à la GTS et en recevoir un amélioré au hasard" }, "4": { "label": "Partir", diff --git a/src/locales/fr/mystery-encounters/mysterious-chest-dialogue.json b/src/locales/fr/mystery-encounters/mysterious-chest-dialogue.json index 4e2fd868bcf..27c715f2deb 100644 --- a/src/locales/fr/mystery-encounters/mysterious-chest-dialogue.json +++ b/src/locales/fr/mystery-encounters/mysterious-chest-dialogue.json @@ -6,7 +6,7 @@ "option": { "1": { "label": "Ouvrir", - "tooltip": "@[SUMMARY_BLUE]{({{trapPercent}}%) Un truc terrible}\n@[SUMMARY_GREEN]{({{commonPercent}}%) Petites récompenses }\n@[SUMMARY_GREEN]{({{ultraPercent}}%) Bonnes récompenses}\n@[SUMMARY_GREEN]{({{roguePercent}}%) Super récompenses}\n@[SUMMARY_GREEN]{({{masterPercent}}%) Incroyables récompenses}", + "tooltip": "@[SUMMARY_BLUE]{({{trapPercent}}%) Un truc terrible}\n@[SUMMARY_GREEN]{({{commonPercent}}%) Petites récompenses}\n@[SUMMARY_GREEN]{({{ultraPercent}}%) Bonnes récompenses}\n@[SUMMARY_GREEN]{({{roguePercent}}%) Super récompenses}\n@[SUMMARY_GREEN]{({{masterPercent}}%) Incroyables récompenses}", "selected": "Vous décidez d’ouvrir le coffre et y trouvez…", "normal": "De simples outils et objets banaux.", "good": "Quelques bons outils et objets.", diff --git a/src/locales/fr/mystery-encounters/safari-zone-dialogue.json b/src/locales/fr/mystery-encounters/safari-zone-dialogue.json index 24834d128c0..8ed842c94b3 100644 --- a/src/locales/fr/mystery-encounters/safari-zone-dialogue.json +++ b/src/locales/fr/mystery-encounters/safari-zone-dialogue.json @@ -1,7 +1,7 @@ { "intro": "C’est un Parc Safari !", "title": "Le Parc Safari", - "description": "Toutes sortes de Pokémon rares et particuliers peuvent y être rencontrés !\nSi vous décidez d’y entrer, vous aurez une limite de 3 Pokémon sauvages à rencontrer que vous pourrez essayer de capturer.\n\nMais attention, ces Pokémon peuvent prendre la fuite avant que vous n’ayez pu les capturer !", + "description": "Toutes sortes de Pokémon rares et particuliers peuvent y être rencontrés !\nSi vous décidez d’y entrer, vous aurez une limite de @[TOOLTIP_TITLE]{{{numEncounters}} Pokémon sauvages} à rencontrer que vous pourrez essayer de capturer.\n\nMais attention, ces Pokémon peuvent prendre la fuite avant que vous n’ayez pu les capturer !", "query": "Voulez-vous y entrer ?", "option": { "1": { diff --git a/src/locales/fr/mystery-encounters/the-expert-pokemon-breeder-dialogue.json b/src/locales/fr/mystery-encounters/the-expert-pokemon-breeder-dialogue.json index ebd450730d6..c587a575887 100644 --- a/src/locales/fr/mystery-encounters/the-expert-pokemon-breeder-dialogue.json +++ b/src/locales/fr/mystery-encounters/the-expert-pokemon-breeder-dialogue.json @@ -25,7 +25,7 @@ "outro": "Ton {{chosenPokemon}} et toi avez\nl’air très heureux !$Tiens, prends ça aussi.", "outro_failed": "Voilà qui est bien décevant…$T’as encore visiblement bien du chemin à faire\npour acquérir la confiance de tes Pokémon !", "gained_eggs": "@s{item_fanfare}Vous recevez\n{{numEggs}} !", - "eggs_tooltip": "\n(+) Recevez {{eggs}}", + "eggs_tooltip": "\n(+) Recevez @[TOOLTIP_TITLE]{{{eggs}}}", "numEggs_one": "{{count}} Œuf {{rarity}}", "numEggs_other": "{{count}} Œufs {{rarity}}s" } diff --git a/src/locales/fr/mystery-encounters/the-pokemon-salesman-dialogue.json b/src/locales/fr/mystery-encounters/the-pokemon-salesman-dialogue.json index 401678490fe..6ef4d06c43e 100644 --- a/src/locales/fr/mystery-encounters/the-pokemon-salesman-dialogue.json +++ b/src/locales/fr/mystery-encounters/the-pokemon-salesman-dialogue.json @@ -3,8 +3,8 @@ "speaker": "Gentleman", "intro_dialogue": "Salutations !\nJ’ai une offre à proposer rien qu’à VOUS !", "title": "Le vendeur de Pokémon", - "description": "« Cet incroyable et unique {{purchasePokemon}} possède un talent jamais vu dans son espèce ! Ce superbe {{purchasePokemon}} est à vous pour le prix imbattable de {{price, money}} ! »\n\n« Qu’en dites-vous ? »", - "description_shiny": "« Cet incroyable et unique {{purchasePokemon}} possède une pigmentation unique jamais vue dans son espèce ! Ce superbe {{purchasePokemon}} est à vous pour le prix imbattable de {{price, money}} ! »\n\n« Qu’en dites-vous ? »", + "description": "« Cet incroyable et unique {{purchasePokemon}} @[TOOLTIP_TITLE]{possède un talent jamais vu dans son espèce} ! Ce superbe {{purchasePokemon}} est à vous pour le prix imbattable de {{price, money}} ! »\n\n« Qu’en dites-vous ? »", + "description_shiny": "« Cet incroyable et unique {{purchasePokemon}} @[TOOLTIP_TITLE]{possède une pigmentation unique jamais vue dans son espèce} ! Ce superbe {{purchasePokemon}} est à vous pour le prix imbattable de {{price, money}} ! »\n\n« Qu’en dites-vous ? »", "query": "Que voulez-vous faire ?", "option": { "1": { diff --git a/src/locales/fr/mystery-encounters/the-strong-stuff-dialogue.json b/src/locales/fr/mystery-encounters/the-strong-stuff-dialogue.json index 563442e4f1f..5961cfce57c 100644 --- a/src/locales/fr/mystery-encounters/the-strong-stuff-dialogue.json +++ b/src/locales/fr/mystery-encounters/the-strong-stuff-dialogue.json @@ -1,7 +1,7 @@ { "intro": "C’est un {{shuckleName}} absolument énorme et\nce qui semble être un énorme bol de… jus ?", "title": "Un breuvage qui arrache", - "description": "Ce {{shuckleName}} qui bloque la route semble incroyablement puissant.\nLe jus qui l’accompagne semble émaner une étrange forme de puissance.\n\nIl tend une patte dans votre direction, l’air de vouloir quelque chose…", + "description": "Ce {{shuckleName}} qui bloque la route semble redoutable.\nLe jus qui l’accompagne semble émaner une étrange forme de puissance.\n\nIl tend une patte dans votre direction, l’air de vouloir quelque chose…", "query": "Que voulez-vous faire ?", "option": { "1": { diff --git a/src/locales/fr/mystery-encounters/the-winstrate-challenge-dialogue.json b/src/locales/fr/mystery-encounters/the-winstrate-challenge-dialogue.json index 144d6a21cde..62caa87bdb4 100644 --- a/src/locales/fr/mystery-encounters/the-winstrate-challenge-dialogue.json +++ b/src/locales/fr/mystery-encounters/the-winstrate-challenge-dialogue.json @@ -3,12 +3,12 @@ "speaker": "La Famille Stratège", "intro_dialogue": "Nous sommes les Stratège !$Ça te dirait d’affronter la famille dans une série\nde combats ?", "title": "Le défi de la Famille Stratège", - "description": "Les Stratège sont une famille de 5 Dresseurs, et ne demandent qu’à se battre ! Si vous parvenez à tous les battre à la suite, ils vous remettront une grosse récompense. Vous sentez-vous d’encaisser ce défi ?", + "description": "Les Stratège sont une famille de @[TOOLTIP_TITLE]{5 Dresseurs}, et ne demandent qu’à se battre ! Si vous parvenez à tous les battre à la suite, ils vous remettront une grosse récompense. Vous sentez-vous d’encaisser ce défi ?", "query": "Que voulez-vous faire ?", "option": { "1": { "label": "Accepter le défi", - "tooltip": "(-) Combat brutal\n(+) Récompense d’un objet spécial", + "tooltip": "(-) Combat brutal contre 5 Dresseurs\n(+) Récompense d’un objet spécial", "selected": "Que le défi commence !" }, "2": { diff --git a/src/locales/fr/mystery-encounters/training-session-dialogue.json b/src/locales/fr/mystery-encounters/training-session-dialogue.json index 33dcabf5c21..9b06651eb59 100644 --- a/src/locales/fr/mystery-encounters/training-session-dialogue.json +++ b/src/locales/fr/mystery-encounters/training-session-dialogue.json @@ -1,24 +1,24 @@ { "intro": "Vous tombez sur du matériel d’entrainement.", "title": "Session d’entrainement", - "description": "Ce matériel semble pouvoir être utilisé pour entrainer un membre de votre équipe ! Il existe plusieurs moyens avec lesquels vous pourriez entrainer un Pokémon, comme en le faisant combattre le reste de votre équipe.", + "description": "Ce matériel semble pouvoir être utilisé pour entrainer un membre de votre équipe ! Il existe plusieurs moyens avec lesquels vous pourriez entrainer un Pokémon, comme @[TOOLTIP_TITLE]{en le faisant combattre et vaincre le reste de votre équipe}.", "query": "Quel entrainement choisir ?", "invalid_selection": "Le Pokémon doit être en bonne santé.", "option": { "1": { "label": "Léger", - "tooltip": "(-) Combat léger\n(+) Augmente au hasard 2 IV du Pokémon", + "tooltip": "(-) Combat léger contre le Pokémon choisi\n(+) Augmente définitivement au hasard 2 IV du Pokémon choisi", "finished": "{{selectedPokemon}} revient vers vous,\nl’air fatigué mais fier de lui !$Ses IV en {{stat1}} et\nen {{stat2}} augmentent !" }, "2": { "label": "Modéré", - "tooltip": "(-) Combat modéré\n(+) Modifie la nature du Pokémon", + "tooltip": "(-) Combat modéré le Pokémon choisi\n(+) Modifie définitivement la nature du Pokémon choisi", "select_prompt": "Sélectionnez la nature pour laquelle\nvotre Pokémon doit s’entrainer.", "finished": "{{selectedPokemon}} revient vers vous,\nl’air fatigué mais fier de lui !$Il a beaucoup changé et\nest devenu {{nature}} !" }, "3": { "label": "Intense", - "tooltip": "(-) Combat intense\n(+) Modifie le talent du Pokémon", + "tooltip": "(-) Combat intense le Pokémon choisi\n(+) Modifie définitivement le talent du Pokémon choisi", "select_prompt": "Sélectionnez le talent pour lequel\nvotre Pokémon doit s’entrainer.", "finished": "{{selectedPokemon}} revient vers vous,\nl’air fatigué mais fier de lui !$Il a beaucoup changé possède\ndesormais le talent {{ability}} !" }, diff --git a/src/locales/fr/mystery-encounters/trash-to-treasure-dialogue.json b/src/locales/fr/mystery-encounters/trash-to-treasure-dialogue.json index fb39a1d12a1..5c6584f6f05 100644 --- a/src/locales/fr/mystery-encounters/trash-to-treasure-dialogue.json +++ b/src/locales/fr/mystery-encounters/trash-to-treasure-dialogue.json @@ -6,7 +6,7 @@ "option": { "1": { "label": "Le fouiller", - "tooltip": "(-) Prix de la boutique triplés\n(+) Gain d’objets exceptionnels", + "tooltip": "(-) Prix de la boutique ×{{costMultiplier}}\n(+) Gain d’objets exceptionnels", "selected": "Vous barbotez dans le tas d’ordures et\nvous vous couvrez de crasse.$Vu votre état, la prochaine boutique va pour sûr\nfortement gonfler ses prix pour vous forcer à fuir !$Mais ça valait le coup, car ce que vous avez trouvé\ndans les ordures est incroyable !" }, "2": { diff --git a/src/locales/it/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/it/mystery-encounters/a-trainers-test-dialogue.json index 9e26dfeeb6e..14f28af2c48 100644 --- a/src/locales/it/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/it/mystery-encounters/a-trainers-test-dialogue.json @@ -1 +1,47 @@ -{} \ No newline at end of file +{ + "intro": "Un allenatore davvero forte ti si avvicina...", + "buck": { + "intro_dialogue": "Yo, allenatore! Sono Chicco.$Ho una proposta super fantastica\nper allenatori forti come te!$Ho qui con me due uova Pokémon rare,\nma vorrei affidarne una a qualcuno.$Se mi darai prova delle tue doti di allenatore,\nti darò quella più rara!", + "accept": "Whoooo, comincio a scaldarmi!", + "decline": "Accidenti, pare che la tua\nsquadra non se la passi bene.$Lascia che ti aiuti." + }, + "cheryl": { + "intro_dialogue": "Ciao, mi chiamo Demetra.$Ho una particolare richiesta,\nmirata ad allenatori come te.$Ho qui con me due uova Pokémon rare,\nma vorrei affidarne una a qualcuno.$Se mi darai prova delle tue doti di allenatore,\nti darò quella più rara!", + "accept": "Spero tu sia pronto/a!", + "decline": "Capisco, mi sa che i tuoi Pokémon\nnon stanno benissimo al momento.$Ti do una mano." + }, + "marley": { + "intro_dialogue": "...@d{64} Sono Risetta.$Ho da farti un'offerta...$Ho con me due uova Pokémon rare,\nma voglio regalarne una.$Se ti dimostri più forte di me,\nti darò la più rara tra le due.", + "accept": "... capisco.", + "decline": "...capisco.$I tuoi Pokémon hanno una brutta cera...\nLasciami aiutare." + }, + "mira": { + "intro_dialogue": "Ciaoo! Sono Matilde!$Mira ha una richiesta\nper un allenatore forte come te!$Mira ha due uova Pokémon rare,\nma Mira vuole darne via una delle due!$Se dimostri a Mira che te la cavi,\nMira ti da la più rara!", + "accept": "Affronterai Mira?\nYuppi!", + "decline": "Aww, niente lotta?\nVa bene!$Ecco, ora Mira cura la tua squadra!" + }, + "riley": { + "intro_dialogue": "Sono Marisio.$Ho una strana proposta\nper gli allenatori forti.$Ho qui due uova Pokémon rare,\nma vorrei darne via una.$Dimostrami quanto vali,\ne ti darò la più rara!", + "accept": "Lo sguardo nei tuoi occhi...\nDiamoci dentro.", + "decline": "Capisco, la tua squadra non se la passa bene.$Lasciami rimediare." + }, + "title": "La prova di un allenatore", + "description": "Pare che questo allenatore ti darà un uovo a prescindere dalla tua volontà. Tuttavia, sconfiggendolo, potrai riceverne uno nettamente più raro.", + "query": "Che cosa farai?", + "option": { + "1": { + "label": "Accetta la sfida", + "tooltip": "(-) Estrema lotta\n(+) Ottieni un @[TOOLTIP_TITLE]{Very Rare Egg}" + }, + "2": { + "label": "Rifiuta la sfida", + "tooltip": "(+) Squadra completamente curata\n(+) Ottieni un @[TOOLTIP_TITLE]{Egg}" + } + }, + "eggTypes": { + "rare": "un uovo raro", + "epic": "un uovo epico", + "legendary": "un uovo leggendario" + }, + "outro": "{{statTrainerName}} ti dona {{eggType}}!" +} diff --git a/src/locales/it/mystery-encounters/absolute-avarice-dialogue.json b/src/locales/it/mystery-encounters/absolute-avarice-dialogue.json index 9e26dfeeb6e..0967ef424bc 100644 --- a/src/locales/it/mystery-encounters/absolute-avarice-dialogue.json +++ b/src/locales/it/mystery-encounters/absolute-avarice-dialogue.json @@ -1 +1 @@ -{} \ No newline at end of file +{} diff --git a/src/locales/it/trainer-names.json b/src/locales/it/trainer-names.json index b29fd2e9f6f..5eb6e327b80 100644 --- a/src/locales/it/trainer-names.json +++ b/src/locales/it/trainer-names.json @@ -180,5 +180,5 @@ "vito": "Enrico", "bug_type_superfan": "Fan n.1 dei tipi Coleottero", - "expert_pokemon_breeder": "Expert Pokémon Breeder" + "expert_pokemon_breeder": "Allevapokémon Esperte" } diff --git a/src/locales/ja/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/ja/mystery-encounters/a-trainers-test-dialogue.json index 33818d27ab3..90dd6100a6f 100644 --- a/src/locales/ja/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/ja/mystery-encounters/a-trainers-test-dialogue.json @@ -31,7 +31,7 @@ "option": { "1": { "label": "勝負を受け取る", - "tooltip": "(-) 勝負がきつい\n(+) @[TOOLTIP_TITLE]{Very Rare Egg}をもらう" + "tooltip": "(-) 勝負が非常にきつい\n(+) @[TOOLTIP_TITLE]{Very Rare Egg}をもらう" }, "2": { "label": "勝負を断る", diff --git a/src/locales/ja/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/ja/mystery-encounters/bug-type-superfan-dialogue.json index c11a1191e4c..1fb4ca4f17c 100644 --- a/src/locales/ja/mystery-encounters/bug-type-superfan-dialogue.json +++ b/src/locales/ja/mystery-encounters/bug-type-superfan-dialogue.json @@ -8,7 +8,7 @@ "option": { "1": { "label": "バトルに挑む", - "tooltip": "(-) 相手が手強い\n(+) ポケモンにむしタイプ技を教える", + "tooltip": "(-) 相手が手強い\n(+) 何の ポケモンにも むしタイプ技 を 教える", "selected": "わたむしを 挑むッシか?\n仲間の むしたちは もう 覚悟していまチュウ!" }, "2": { diff --git a/src/locales/ja/mystery-encounters/clowning-around-dialogue.json b/src/locales/ja/mystery-encounters/clowning-around-dialogue.json index 6b429da5083..c44036ae23e 100644 --- a/src/locales/ja/mystery-encounters/clowning-around-dialogue.json +++ b/src/locales/ja/mystery-encounters/clowning-around-dialogue.json @@ -8,23 +8,23 @@ "option": { "1": { "label": "クラウンと勝負", - "tooltip": "(-) 勝負はおかしい\n(?) 手持ちポケモンの特性は変化", + "tooltip": "(-) 勝負は おかしい\n(?) 手持ちポケモン 1匹の 特性は 変化", "selected": "パッとしない ポケモンを ぽかぽか パンチしちゃうんだ ぴょん!", - "apply_ability_dialogue": "とても たくましく 倒した!\n倒すのが 得意な トレーナーと一緒に 特性を 取り替えたい!", + "apply_ability_dialogue": "とても たくましく 倒した!\n倒すのが 得意な トレーナーと一緒に 特別な 特性を 取り替えたい!", "apply_ability_message": "クラウンは スキルスワップで 手持ちポケモン 1匹の\n特性を {{ability}}と 取り替えることを 申し出ています!", "ability_prompt": "手持ちポケモンの 特性を\n恒久的に {{ability}}に 変化しますか?", "ability_gained": "@s{level_up_fanfare}{{chosenPokemon}}は {{ability}}の 特性を 身についた!" }, "2": { "label": "怒らない", - "tooltip": "(-) クラウンは怒る\n(?) 手持ちポケモンのアイテムは変化", + "tooltip": "(?) 手持ちポケモン 1匹の アイテムは 変化", "selected": "しつこい! シンプルな 勝負を スルー?!\n己は 俺の 怒りを 起こした!", "selected_2": "クラウンの {{blacephalonName}}は トリックを 使った!\n{{switchPokemon}}の 持ったアイテムは 全て デタラメに 交換された!", "selected_3": "豪華に ごまかした 下衆…… 元気でね!" }, "3": { "label": "悪口を返す", - "tooltip": "(-) クラウンは怒る\n(?) 手持ちポケモンのタイプは変化", + "tooltip": "(?) 手持ちポケモン 全員の タイプは 変化", "selected": "しつこい! シンプルな 勝負を スルー?!\n己は 俺の 怒りを 起こした!", "selected_2": "クラウンの {{blacephalonName}}は 変な技を 使った!\n手持ちポケモン 全員の タイプは デタラメに 交換された!", "selected_3": "豪華に ごまかした 下衆…… 元気でね!" diff --git a/src/locales/ja/mystery-encounters/dancing-lessons-dialogue.json b/src/locales/ja/mystery-encounters/dancing-lessons-dialogue.json index 2bade712ec4..b2911425a92 100644 --- a/src/locales/ja/mystery-encounters/dancing-lessons-dialogue.json +++ b/src/locales/ja/mystery-encounters/dancing-lessons-dialogue.json @@ -1,7 +1,7 @@ { "intro": "相手が いなくて 寂しそうな {{oricorioName}}は 悲しく 踊ってます。", "title": "フリフリ振り付け", - "description": "{{oricorioName}}は 攻撃的 じゃなさそう…… むしろ、 悲しい 顔を しています。\n\n誰かと 踊りたいだけ かもしれません……", + "description": "{{oricorioName}}は 攻撃的 じゃなさそう…… むしろ、 しょんぼり している ようです。\n\n誰かと 踊りたいだけ かもしれません……", "query": "どうしますか?", "option": { "1": { @@ -12,7 +12,7 @@ }, "2": { "label": "踊りを覚える", - "tooltip": "(+) ポケモンにめざめるダンスを教える", + "tooltip": "(+) 何の 手持ち ポケモンにも めざめるダンス を 教える", "selected": "{{oricorioName}}の 踊りを よく 調べます……$@s{level_up_fanfare}{{selectedPokemon}}が {{oricorioName}}から 技を 覚えました!" }, "3": { diff --git a/src/locales/ja/mystery-encounters/fiery-fallout-dialogue.json b/src/locales/ja/mystery-encounters/fiery-fallout-dialogue.json index 9e26dfeeb6e..3de5f0a764a 100644 --- a/src/locales/ja/mystery-encounters/fiery-fallout-dialogue.json +++ b/src/locales/ja/mystery-encounters/fiery-fallout-dialogue.json @@ -1 +1,26 @@ -{} \ No newline at end of file +{ + "intro": "猛烈な 煙と灰の嵐に 遭遇しました! ", + "title": "燃える熱気", + "description": "渦巻く 灰と 残り火に より、 視界は ほぼゼロに なりました。 どうやら この状況を 引き起こしている 原因は 何かある ようです…… しかし、これほどの規模の 現象を 起こしたのは 一体 何でしょうのか​​?", + "query": "どうしますか?", + "option": { + "1": { + "label": "原因を見つける", + "tooltip": "(?) 原因を発見\n(-) キツいバトル", + "selected": "火の嵐を 突き進むと、 交配の踊りを している 2匹の {{volcaronaName}} を 見つけます!$邪魔に 快く思わないで 襲いかかってきます!" + }, + "2": { + "label": "避難してみる", + "tooltip": "(-) 気象状態に耐える", + "selected": "避難を 探してみる 間に 気象状態が 重大な 被害を もたらします! $ 手持ちポケモンは 最大HPの 20%の ダメージを 受けます!", + "target_burned": "その上、 {{burnedPokemon}} も やけど状態 になりました!" + }, + "3": { + "label": "ほのおポケモンが助ける", + "tooltip": "(+) 状態が治まる\n(+) もくたんをもらう", + "disabled_tooltip": "選ぶには 2匹の ほのおタイプの ポケモンが 必要", + "selected": "{{option3PrimaryName}}と {{option3SecondaryName}}が 交配の踊りを している 2匹の {{volcaronaName}}まで 導きます!$おかげさまで 落ち着かせる ことができ\n{{volcaronaName}}が 問題なく 立ち去ります。" + } + }, + "found_charcoal": "気象状態が 治ってから \n{{leadPokemon}}が 地面で 何かを 見つけます。$@s{item_fanfare}{{leadPokemon}}が もくたんを 手に入れた!" +} diff --git a/src/locales/ja/mystery-encounters/fight-or-flight-dialogue.json b/src/locales/ja/mystery-encounters/fight-or-flight-dialogue.json index 9e26dfeeb6e..757a258fa3a 100644 --- a/src/locales/ja/mystery-encounters/fight-or-flight-dialogue.json +++ b/src/locales/ja/mystery-encounters/fight-or-flight-dialogue.json @@ -1 +1,25 @@ -{} \ No newline at end of file +{ + "intro": "あの ポケモンの 近くで 地面に何かが きらきらと 輝いています!", + "title": "闘争・逃走", + "description": "アイテムを 守っている 強いポケモンが いる ようです。バトルは 直接的な 取り方ですが、 強そうです。 適切な 手持ちポケモンが いれば、 アイテムを盗まれる かもしれません。", + "query": "どうしますか?", + "option": { + "1": { + "label": "バトルする", + "tooltip": "(-) 勝負がキツい\n(+) 新しいアイテム", + "selected": "恐れないで 強いポケモンに 近寄ります。", + "stat_boost": "{{enemyPokemon}}は 潜在的な 強さで 能力を 一つ 上げた!" + }, + "2": { + "label": "アイテムを盗む", + "disabled_tooltip": "選ぶには 手持ちポケモンが 特定な 技を 覚えている必要 が ある", + "tooltip": "(+) {{option2PrimaryName}}が  {{option2PrimaryMove}}を使う", + "selected": ".@d{32}.@d{32}.@d{32}${{option2PrimaryName}}が 手を貸し  {{option2PrimaryMove}}を 使います!$アイテムを 奪いました!" + }, + "3": { + "label": "立ち去る", + "tooltip": "(-) ご褒美なし", + "selected": "強いポケモンと アイテムを 置いて 冒険を 進みます。" + } + } +} \ No newline at end of file diff --git a/src/locales/ja/mystery-encounters/fun-and-games-dialogue.json b/src/locales/ja/mystery-encounters/fun-and-games-dialogue.json index 9e26dfeeb6e..f081c3b517d 100644 --- a/src/locales/ja/mystery-encounters/fun-and-games-dialogue.json +++ b/src/locales/ja/mystery-encounters/fun-and-games-dialogue.json @@ -1 +1,30 @@ -{} \ No newline at end of file +{ + "intro_dialogue": "さあ さあ、 皆さま! 新しい {{wobbuffetName}}叩き で運試しを しましょう!", + "speaker": "興行主", + "title": "叩きゲーム? ソーナンス!", + "description": "移動遊園地の ご褒美ゲーム です! @[TOOLTIP_TITLE]{3ターン以内で} {{wobbuffetName}}を @[TOOLTIP_TITLE]{倒せずに} @[TOOLTIP_TITLE]{1 HP}に できるだけ 近づけて、 そして {{wobbuffetName}}が 大きい カウンターで ベルを 鳴らします。\n気をつけて! {{wobbuffetName}}を 倒すと 復活費を 払わなければ なりません!", + "query": "試しますか?", + "option": { + "1": { + "label": "ゲームを試す", + "tooltip": "(-) {{option1Money, money}}を払う\n(+) {{wobbuffetName}}叩き を 試して", + "selected": "運試し、 しましょう!" + }, + "2": { + "label": "立ち去る", + "tooltip": "(-) ご褒美なし", + "selected": "僅かな 後悔の 気持ちで\n冒険を 進みます。" + } + }, + "ko": "ダメ! {{wobbuffetName}}は 倒れました!$ゲームを 負けて\n復活費を 払わなくちゃ いけません……", + "charging_continue": "{{wobbuffetName}}は カウンターの 力を たくわえて続けます!", + "turn_remaining_3": "残り 3ターン!", + "turn_remaining_2": "残り 2ターン!", + "turn_remaining_1": "残り 1ターン!", + "end_game": "時間です!${{wobbuffetName}}は カウンターを 繰り出すと@d{16}.@d{16}.@d{16}.", + "best_result": "{{wobbuffetName}}は ボタンを ぶん殴り、\nベルが 上部から 外れました!$大賞を 勝ちました!", + "great_result": "{{wobbuffetName}}は ボタンを 叩き、 ベルを 鳴らす 寸前でした!$おしい!\n2位賞を 勝ちました!", + "good_result": "{{wobbuffetName}}は ボタンを 叩き、 スケールの 真ん中まで 上がりました!$3位賞を 勝ちました!", + "bad_result": "{{wobbuffetName}}は 微妙に ボタンを 触ります。 何も 起こりません。$やだ!\n何も 勝ちませんでした!", + "outro": "楽しいゲーム でした!" +} diff --git a/src/locales/ja/mystery-encounters/global-trade-system-dialogue.json b/src/locales/ja/mystery-encounters/global-trade-system-dialogue.json index 9e26dfeeb6e..41b40f85518 100644 --- a/src/locales/ja/mystery-encounters/global-trade-system-dialogue.json +++ b/src/locales/ja/mystery-encounters/global-trade-system-dialogue.json @@ -1 +1,32 @@ -{} \ No newline at end of file +{ + "intro": "グローバルトレードシステムの インターフェイスです!", + "title": "GTS", + "description": "GTS: この新技術の 軌跡で 世界中の 誰とでも 接続して ポケモンを 通信交換できます。 今日の 交換に 幸運が 訪れるでしょうか?", + "query": "どうします?", + "option": { + "1": { + "label": "交換申出を確認", + "tooltip": "(+) 手持ちポケモン 1匹に 対して 交換申出を 選ぶ", + "trade_options_prompt": "交換で もらう ポケモンを 選んでください" + }, + "2": { + "label": "ミラクル交換", + "tooltip": "(+) ポケモンを 1匹 GTSに 送って ランダムに 特別な ポケモンを 1匹 もらう" + }, + "3": { + "label": "アイテム交換", + "trade_options_prompt": "送る アイテムを 選んでください", + "invalid_selection": "交換できる アイテムが ありません", + "tooltip": "(+) アイテムを 1つ GTSに 送って ランダムな 改良した アイテムを 1つ もらう" + }, + "4": { + "label": "立ち去ら", + "tooltip": "(-) ご褒美なし", + "selected": "今日は 交換する 暇は ありません!\n進みましょう。" + } + }, + "pokemon_trade_selected": "{{tradedPokemon}}は {{tradeTrainerName}}に 送られます。", + "pokemon_trade_goodbye": "さようなら {{tradedPokemon}}!", + "item_trade_selected": "{{chosenItem}}は {{tradeTrainerName}}に 送られます。$.@d{64}.@d{64}.@d{64}\n@s{level_up_fanfare}交換 完了!${{tradeTrainerName}}から {{itemName}}を もらいました!", + "trade_received": "@s{evolution_fanfare}{{received}}を {{tradeTrainerName}}から もらいました!" +} diff --git a/src/locales/ja/mystery-encounters/lost-at-sea-dialogue.json b/src/locales/ja/mystery-encounters/lost-at-sea-dialogue.json index 9e26dfeeb6e..0c0909b7f2d 100644 --- a/src/locales/ja/mystery-encounters/lost-at-sea-dialogue.json +++ b/src/locales/ja/mystery-encounters/lost-at-sea-dialogue.json @@ -1 +1,28 @@ -{} \ No newline at end of file +{ + "intro": "海を あてもなく さまよっていて 結局 どこにも たどり着けない ようです……", + "title": "海で迷子", + "description": "海は 荒れていて 元気が 尽きています。\nこれは マズい…… この状況から 抜け出す 方法は ないでしょうか?", + "query": "どうしますか?", + "option": { + "1": { + "label": "{{option1PrimaryName}}が 役に立つ かも", + "label_disabled": "{{option1RequiredMove}}できない", + "tooltip": "(+) {{option1PrimaryName}} に 助けられる\n(+) {{option1PrimaryName}} が 経験値を 得る", + "tooltip_disabled": "{{option1RequiredMove}} できる ポケモンが いない", + "selected": "{{option1PrimaryName}}が 先に 泳いで 導いてくれます。${{option1PrimaryName}}は この困難な 時期に さらに 強くなった ようです!" + }, + "2": { + "label": "{{option2PrimaryName}}が 役に立つ かも", + "label_disabled": "{{option2RequiredMove}}ことが できない", + "tooltip": "(+) {{option2PrimaryName}}に 助けられる\n(+) {{option2PrimaryName}}が 経験値を 得る", + "tooltip_disabled": "{{option2RequiredMove}}ことが できる ポケモンが いない", + "selected": "{{option2PrimaryName}}が 船の 前を 飛んで 正しい 航路に 戻します。${{option2PrimaryName}}は この困難な 時期に さらに 強くなった ようです!" + }, + "3": { + "label": "あてもなくさまよう", + "tooltip": "(-) 手持ちポケモン 全員が HP {{damagePercentage}}% 失う", + "selected": "船で 漂いていて 方向なく 操縦を 続け ついに 覚えている 目印を 見つけます。$手持ちポケモンは この試練の せいで 疲れ果てています……" + } + }, + "outro": "正しい 航路に 戻りました。" +} diff --git a/src/locales/ja/mystery-encounters/mysterious-challengers-dialogue.json b/src/locales/ja/mystery-encounters/mysterious-challengers-dialogue.json index 9e26dfeeb6e..b5cf2742f6f 100644 --- a/src/locales/ja/mystery-encounters/mysterious-challengers-dialogue.json +++ b/src/locales/ja/mystery-encounters/mysterious-challengers-dialogue.json @@ -1 +1,22 @@ -{} \ No newline at end of file +{ + "intro": "謎の 挑戦者が 現れました!", + "title": "謎の挑戦者", + "description": "挑戦者を 倒せば 印象付けて 恩恵を 受けられる かもしれません。 しかし、 強そうな 相手が いて キツい チャレンジに なります。", + "query": "誰とバトルしますか?", + "option": { + "1": { + "label": "賢く思慮深い相手", + "tooltip": "(-) 勝負が標準\n(+) 技アイテムのご褒美" + }, + "2": { + "label": "強力な相手", + "tooltip": "(-) 勝負がキツい\n(+) 良いご褒美" + }, + "3": { + "label": "一番強大な相手", + "tooltip": "(-) 勝負が残酷\n(+) すごいご褒美" + }, + "selected": "トレーナーは 踏み出します……" + }, + "outro": "謎の 挑戦者は 倒れました!" +} diff --git a/src/locales/ja/mystery-encounters/mysterious-chest-dialogue.json b/src/locales/ja/mystery-encounters/mysterious-chest-dialogue.json index 9e26dfeeb6e..b8b3613c4c5 100644 --- a/src/locales/ja/mystery-encounters/mysterious-chest-dialogue.json +++ b/src/locales/ja/mystery-encounters/mysterious-chest-dialogue.json @@ -1 +1,23 @@ -{} \ No newline at end of file +{ + "intro": "あれは……@d{32} 宝箱?", + "title": "謎の宝箱", + "description": "美しく 飾られた 宝箱が 地面に あります。 中には 何か 良いものが あるはず…… でしょう?", + "query": "開けますか?", + "option": { + "1": { + "label": "開ける", + "tooltip": "@[SUMMARY_BLUE]{({{trapPercent}}%) 何かヒドい事}\n@[SUMMARY_GREEN]{({{commonPercent}}%) まあいいご褒美}\n@[SUMMARY_GREEN]{({{ultraPercent}}%) 良いご褒美}\n@[SUMMARY_GREEN]{({{roguePercent}}%) すごいご褒美}\n@[SUMMARY_GREEN]{({{masterPercent}}%) 素晴らしいご褒美}", + "selected": "宝箱を 開けると 見つけるのは……", + "normal": "普通の 道具や アイテム だけです…… ", + "good": "結構 良い道具や アイテム です。", + "great": "すごい 道具や アイテム ですね!", + "amazing": "わあ! 何と 素晴らしい アイテム!", + "bad": "ああ、 だめだ!@d{32}\n宝箱は 実に {{gimmighoulName}}の 変装でした!${{pokeName}}は守ろうとして 飛び込んで 来ますが、\nその結果 倒れてしまいます!" + }, + "2": { + "label": "危なそうで立ち去る", + "tooltip": "(-) ご褒美なし", + "selected": "僅かな 後悔の 気持ちで\nさっさと 先を 進みます。" + } + } +} diff --git a/src/locales/ja/mystery-encounters/part-timer-dialogue.json b/src/locales/ja/mystery-encounters/part-timer-dialogue.json index 9e26dfeeb6e..2c9353b2b61 100644 --- a/src/locales/ja/mystery-encounters/part-timer-dialogue.json +++ b/src/locales/ja/mystery-encounters/part-timer-dialogue.json @@ -1 +1,31 @@ -{} \ No newline at end of file +{ + "intro": "忙しそうな 作業員に 呼び止められます。", + "speaker": "作業員", + "intro_dialogue": "たくさんの 有能な ポケモンを 持っている ようですね!$ バイトを 受け取って 手伝ってくれる なら 会社は 支払いますよ!", + "title": "バリバリバイト", + "description": "やらなければ ならない 仕事が たくさん あります。 手持ちポケモンが 仕事に どれだけ 適しているかに よって 稼げる お金は 増えたり 減ったり する ようです。", + "query": "どの仕事を選びますか?", + "invalid_selection": "ポケモンは 十分に 元気 でなければ ならない", + "option": { + "1": { + "label": "配達員", + "tooltip": "(-) ポケモンが 素早さを 使う\n(+) @[MONEY]{Money}を 稼ぐ", + "selected": "Your {{selectedPokemon}} works a shift delivering orders to customers." + }, + "2": { + "label": "倉庫作業員", + "tooltip": "(-) ポケモンが 強さと 持久力を 使う\n(+) @[MONEY]{Money}を稼ぐ", + "selected": "{{selectedPokemon}}は 倉庫内で アイテムを 移動する シフトで 働きました。" + }, + "3": { + "label": "店員", + "tooltip": "(-) {{option3PrimaryName}}は {{option3PrimaryMove}}を 使う\n(+) @[MONEY]{Money}を稼ぐ", + "disabled_tooltip": "この仕事を 選ぶには 特定な 技が 必要", + "selected": "一日中に {{option3PrimaryName}}は {{option3PrimaryMove}}を 使って 顧客を 引きつけます!" + } + }, + "job_complete_good": "助けてくれて ありがとう ございました!\n{{selectedPokemon}}は すごく 役に 立ちましたよ!$今日の 給料、 どうぞ!", + "job_complete_bad": "{{selectedPokemon}} が ちょっと 手伝ってくれました ね!$今日の 給料、 どうぞ!", + "pokemon_tired": "{{selectedPokemon}}は 疲れ果てました!\n 技の PPが 全て 2まで 減りました!", + "outro": "また いつか 手伝いに来て くださいね!" +} diff --git a/src/locales/ja/mystery-encounters/safari-zone-dialogue.json b/src/locales/ja/mystery-encounters/safari-zone-dialogue.json index 9e26dfeeb6e..9a383abb368 100644 --- a/src/locales/ja/mystery-encounters/safari-zone-dialogue.json +++ b/src/locales/ja/mystery-encounters/safari-zone-dialogue.json @@ -1 +1,46 @@ -{} \ No newline at end of file +{ + "intro": "サファリゾーン です!", + "title": "サファリゾーン", + "description": "ここには 様々な 珍しい 特別な ポケモンが います!\n入場すれば @[TOOLTIP_TITLE]{{{numEncounters}}回の遭遇} という 制限時間で 野生ポケモンを 捕まえることが できます。\n\n注意: 野生ポケモンは 捕まえる前に 逃げてしまう 可能性も あります!", + "query": "入場しますか?", + "option": { + "1": { + "label": "入場する", + "tooltip": "(-) {{option1Money, money}}を払う\n@[SUMMARY_GREEN]{(?) サファリゾーン}", + "selected": "運試し しましょう!" + }, + "2": { + "label": "立ち去る", + "tooltip": "(-) ご褒美なし", + "selected": "僅かな 後悔の 気持ちで\nさっさと 先を 進みます。" + } + }, + "safari": { + "1": { + "label": "ボールを投げる", + "tooltip": "(+) モンスターボールを投げる", + "selected": "モンスターボールを 投げた!" + }, + "2": { + "label": "エサを投げる", + "tooltip": "(+) 捕捉率が上がる\n(-) 逃走率が上がる可能性", + "selected": "エサを 投げた!" + }, + "3": { + "label": "どろを投げる", + "tooltip": "(+) 逃走率が下がる\n(-) 捕捉率が下がる可能性", + "selected": "どろを 投げた!" + }, + "4": { + "label": "逃げる", + "tooltip": "(?) ポケモンから逃げる" + }, + "watching": "{{pokemonName}}は 様子を うかがっている!", + "eating": "{{pokemonName}}は エサを たべている!!", + "busy_eating": "{{pokemonName}}は エサを 食べるのに 夢中だ!", + "angry": "{{pokemonName}}は 怒っている!", + "beside_itself_angry": "{{pokemonName}}は 怒りで 我を 忘れている!", + "remaining_count": "残る ポケモン: {{remainingCount}}匹!" + }, + "outro": "楽しい 小旅行でした!" +} diff --git a/src/locales/ja/mystery-encounters/shady-vitamin-dealer-dialogue.json b/src/locales/ja/mystery-encounters/shady-vitamin-dealer-dialogue.json index 9e26dfeeb6e..1d909c21918 100644 --- a/src/locales/ja/mystery-encounters/shady-vitamin-dealer-dialogue.json +++ b/src/locales/ja/mystery-encounters/shady-vitamin-dealer-dialogue.json @@ -1 +1,27 @@ -{} \ No newline at end of file +{ + "intro": "黒い コートを 着た 男が 近づいてくる。", + "speaker": "怪しげな営業マン", + "intro_dialogue": ".@d{16}.@d{16}.@d{16}$金が あれば 商品は 準備してるぞ。$まずは ポケモンが 耐えられるかどうか 確認せよ。", + "title": "栄養(?)士", + "description": "営業マンは コートを 開けて えいようドリンクを 表します。 提示している 価格は すごく (信じられない ほど すごく) お得 ですね……\nパッケージプランを 2つ 提案します。", + "query": "どのプランを選びますか?", + "invalid_selection": "ポケモンは 十分に 元気 でなければ ならない.", + "option": { + "1": { + "label": "安いプラン", + "tooltip": "(-) {{option1Money, money}}を払う\n(-) 薬害?\n(+) 選ぶ ポケモンが えいようドリンクを 2つ 飲む" + }, + "2": { + "label": "高いプラン", + "tooltip": "(-) {{option2Money, money}}を払う\n(+) 選ぶ ポケモンが えいようドリンクを 2つ 飲む" + }, + "3": { + "label": "抜け出す", + "tooltip": "(-) ご褒美なし", + "selected": "へえ、 お前 根性なしだとは 思わなかったよ。" + }, + "selected": "営業マンは 2本の ドリンクを 手渡し すぐに 姿を消します。${{selectedPokemon}}の {{boost1}} と {{boost2}} は 上がった!" + }, + "cheap_side_effects": "しかし! ドリンクは 薬害が ありました!${{selectedPokemon}}は ダメージを 受けて\n性格は {{newNature}}に 変化しちゃいました!", + "no_bad_effects": "薬害が なかった ようです!" +} diff --git a/src/locales/ja/mystery-encounters/slumbering-snorlax-dialogue.json b/src/locales/ja/mystery-encounters/slumbering-snorlax-dialogue.json index 9e26dfeeb6e..e163f46854f 100644 --- a/src/locales/ja/mystery-encounters/slumbering-snorlax-dialogue.json +++ b/src/locales/ja/mystery-encounters/slumbering-snorlax-dialogue.json @@ -1 +1,25 @@ -{} \ No newline at end of file +{ + "intro": "狭い 通路を 歩いていて 道を ふさいでいる そびえ立つ影が 見えます。$近づいていくと {{snorlaxName}}が 安らかに 眠っています。\n回避する 方法は ないようです。", + "title": "ぐうぐう {{snorlaxName}}", + "description": "攻撃して 動かそうとする ことが できます。 もしくは、 単に 目を覚ますのを 待つ ことも できますが、 それは どれくらい 時間が かかるでしょうか……", + "query": "どうしますか?", + "option": { + "1": { + "label": "バトルする", + "tooltip": "(-) 眠る{{snorlaxName}}と勝負\n(+) 特別なご褒美", + "selected": "恐れないで ポケモンに 近寄ります!" + }, + "2": { + "label": "動くのを待つWait for It to Move", + "tooltip": "(-) 長い間に待つ\n(+) 手持ちが回復", + "selected": ".@d{32}.@d{32}.@d{32}$少しの 間に 待ちますが、 {{snorlaxName}}の あくびは 手持ちポケモンを 眠くします……", + "rest_result": "みんなが 目覚めると、 {{snorlaxName}}の姿が 消えました……\nしかし、 ポケモン 全員が 回復しています!" + }, + "3": { + "label": "アイテムを盗む", + "tooltip": "(+) {{option3PrimaryName}}は {{option3PrimaryMove}}を 使う\n(+) 特別なご褒美", + "disabled_tooltip": "選ぶには 特定な 技が 必要", + "selected": "{{option3PrimaryName}は {{option3PrimaryMove}}を 使った!$@s{item_fanfare} 眠っている {{snorlaxName}}の たべのこしを\n盗んで さっさと 逃げます!" + } + } +} diff --git a/src/locales/ja/mystery-encounters/teleporting-hijinks-dialogue.json b/src/locales/ja/mystery-encounters/teleporting-hijinks-dialogue.json index 9e26dfeeb6e..a2a9e1f384d 100644 --- a/src/locales/ja/mystery-encounters/teleporting-hijinks-dialogue.json +++ b/src/locales/ja/mystery-encounters/teleporting-hijinks-dialogue.json @@ -1 +1,27 @@ -{} \ No newline at end of file +{ + "intro": "謎の 機械は うるさく ガーガーって 音が しています……", + "title": "ハイテレポーテンション", + "description": "機械には 看板が 付いてる:\n「使うには お金を 入れて カプセルに 入る」\n\nどこかに テレポートできる かもしれません……", + "query": "どうしますか?", + "option": { + "1": { + "label": "お金を入れて", + "tooltip": "(-) {{price, money}}を払う\n(?) 新しいバイオームにテレポート", + "selected": "お金を 入れると カプセルが 開きます。\n中に 入ると……" + }, + "2": { + "label": "ポケモンが役に立つ", + "tooltip": "(-) {{option2PrimaryName}}が役に立つ\n(+) {{option2PrimaryName}}が 経験値を 得る\n(?) 新しいバイオームにテレポート", + "disabled_tooltip": "選ぶには はがねタイプや でんきタイプの ポケモンが 必要", + "selected": "{{option2PrimaryName}}の タイプの お陰で 機会の ペイウォールを 突き通せます!$カプセルが 開いてから 中に 入ります……" + }, + "3": { + "label": "機会を調べる", + "tooltip": "(-) ポケモン勝負", + "selected": "機会の ピカピカする 光 や\nガーガーって 音に 引き込まれます…… $気づかず 野生ポケモンに 待ち伏せられます!" + } + }, + "transport": "機会は 激しく 揺れ\n変な 音を し出します!$突然に 揺れも 音も 全然 終わって 静かに なります。", + "attacked": "カプセルを 出ると 全く 新しい 地域……\nの ポケモンを 脅かします! $野生ポケモンが 襲いかかってきます!", + "boss_enraged": "{{enemyPokemon}}は 怒り出す!" +} diff --git a/src/locales/ja/mystery-encounters/the-expert-pokemon-breeder-dialogue.json b/src/locales/ja/mystery-encounters/the-expert-pokemon-breeder-dialogue.json index 0967ef424bc..a59cf55694e 100644 --- a/src/locales/ja/mystery-encounters/the-expert-pokemon-breeder-dialogue.json +++ b/src/locales/ja/mystery-encounters/the-expert-pokemon-breeder-dialogue.json @@ -1 +1,31 @@ -{} +{ + "intro": "タマゴを たくさん 運んでいる トレーナー です!", + "intro_dialogue": "チーッス トレーナーちゃん!$手持ちポケモンの 1匹、 なんか 落ち込んでる みたいね……$あたしと 元気が出る バトル しない?", + "title": "ブリーダー名人", + "description": "@[TOOLTIP_TITLE]{1匹のポケモン しか 使えない} バトルに 挑まれました。 たぶん キツく なりますが、 きっと 選んだ ポケモンと よっぽど 仲良く なれます!\n勝ったら ブリーダー名人が 数個の @[TOOLTIP_TITLE]{ポケモンタマゴ}を くれます。", + "query": "どのポケモンとバトルしますか?", + "cleffa_1_nickname": "エース", + "cleffa_2_nickname": "トッピクシー", + "cleffa_3_nickname": "華麗なる{{speciesName}}", + "option": { + "1": { + "label": "{{pokemon1Name}}", + "tooltip_base": "(-) 勝負がキツい\n(+) {{pokemon1Name}}と仲良くなる" + }, + "2": { + "label": "{{pokemon2Name}}", + "tooltip_base": "(-) 勝負がキツい\n(+) {{pokemon2Name}}と仲良くなる" + }, + "3": { + "label": "{{pokemon3Name}}", + "tooltip_base": "(-) 勝負がキツい\n(+) {{pokemon3Name}}と仲良くなる" + }, + "selected": "レッツゴー!" + }, + "outro": "ねえ、 {{chosenPokemon}} すごく 嬉しくなったわ!$そして、 これらも どうぞ!", + "outro_failed": "なんか ガッカリ ね……$手持ち ポケモンの 信用を 得るまで\nまだまだ みたいんだわ!", + "gained_eggs": "@s{item_fanfare}{{numEggs}}を もらいました!", + "eggs_tooltip": "\n(+) @[TOOLTIP_TITLE]{{{eggs}}}を得る", + "numEggs_one": "{{count}} {{rarity}} タマゴ", + "numEggs_other": "{{count}} {{rarity}} タマゴ" +} diff --git a/src/locales/ja/mystery-encounters/the-pokemon-salesman-dialogue.json b/src/locales/ja/mystery-encounters/the-pokemon-salesman-dialogue.json index 9e26dfeeb6e..5f3fe23ff1f 100644 --- a/src/locales/ja/mystery-encounters/the-pokemon-salesman-dialogue.json +++ b/src/locales/ja/mystery-encounters/the-pokemon-salesman-dialogue.json @@ -1 +1,23 @@ -{} \ No newline at end of file +{ + "intro": "ご機嫌な おじいさんは 近寄ります!", + "speaker": "ジェントルマン", + "intro_dialogue": "ハローゼアー! どこにも 見つけない ディールが あります!", + "title": "ポケモンのセールスマン", + "description": "「この {{purchasePokemon}}は とても ユニークで 種類の 中で @[TOOLTIP_TITLE]{滅多に 見られない 特性が あります}! {{price, money}}だけで この アメイジングな {{purchasePokemon}}を もらいますよ!」\n\n 「いかがですか?」", + "description_shiny": "「この {{purchasePokemon}}は とても ユニークで 種類の 中で @[TOOLTIP_TITLE]{滅多に 見られない カラーが あります}! {{price, money}}だけで この アメイジングな {{purchasePokemon}}を もらいますよ!」\n\n 「いかがですか?」", + "query": "どうします?", + "option": { + "1": { + "label": "受け取る", + "tooltip": "(-) {{price, money}}を払う\n(+) 隠れ特性の ある {{purchasePokemon}}を もらう", + "tooltip_shiny": "(-) {{price, money}}を払う\n(+) 色違いの {{purchasePokemon}}を もらう", + "selected_message": "とんでもない 価格を 払って {{purchasePokemon}}を 買いました。", + "selected_dialogue": "エクセレント・チョイス!$あなたは ビジネス上手 なんでしょうね。$あ、そうでね……@d{64} 返品が 受け入れない。 分かった?" + }, + "2": { + "label": "断る", + "tooltip": "(-) ご褒美なし", + "selected": "ノー?@d{32} ノーって言ってる!?$これは 恩恵ですよ! チッ……" + } + } +} diff --git a/src/locales/ja/mystery-encounters/the-strong-stuff-dialogue.json b/src/locales/ja/mystery-encounters/the-strong-stuff-dialogue.json index 9e26dfeeb6e..bb04f48e643 100644 --- a/src/locales/ja/mystery-encounters/the-strong-stuff-dialogue.json +++ b/src/locales/ja/mystery-encounters/the-strong-stuff-dialogue.json @@ -1 +1,21 @@ -{} \ No newline at end of file +{ + "intro": "どっしりとした {{shuckleName}}です。\nその隣には… ジュースのたくわえ?の ようです……", + "title": "残酷に濃く", + "description": "道を 塞ぐ {{shuckleName}}は 信じられないほど 強そう です。 そして、 その隣に ある ジュースは 何らかの 力を 発しています。\n\n {{shuckleName}}は 触手を 伸ばしていて 何かを したがります……", + "query": "どうします?", + "option": { + "1": { + "label": "{{shuckleName}}に近寄る", + "tooltip": "(?) 何か ヒドいこと や スゴいことが 起こる", + "selected": "突然に 気を 失います。", + "selected_2": "@f{150}目覚めると、 {{shuckleName}}は 消えて\nジュースは 飲み干されている ようです。${{highBstPokemon1}}と {{highBstPokemon2}}は\nヒドい 無気力に 襲われます!$基本能力は {{reductionValue}}で 減っています!$残りの ポケモンは スゴい 活力を 感じます!\n基本能力は {{increaseValue}}で 上がっています!" + }, + "2": { + "label": "{{shuckleName}}とバトルする", + "tooltip": "(-) 勝負がキツい\n(+) 特別なご褒美", + "selected": "怒り出した {{shuckleName}}は ジュースを 少し 飲んで 襲いかかる!", + "stat_boost": "{{shuckleName}}の ジュースは 能力を 上げた!" + } + }, + "outro": "なんとも 奇妙な 展開ですね……" +} diff --git a/src/locales/ja/mystery-encounters/the-winstrate-challenge-dialogue.json b/src/locales/ja/mystery-encounters/the-winstrate-challenge-dialogue.json index 9e26dfeeb6e..0e2b185ab4a 100644 --- a/src/locales/ja/mystery-encounters/the-winstrate-challenge-dialogue.json +++ b/src/locales/ja/mystery-encounters/the-winstrate-challenge-dialogue.json @@ -1 +1,22 @@ -{} \ No newline at end of file +{ + "intro": "家の 外に 立っている 家族 です…", + "speaker": "カチヌキファミリー", + "intro_dialogue": "カチヌキファミリーです!$どうだ? ここは ひとつ わたしたち\n家族と ポケモン勝負を してみないか?", + "title": "カチヌキファミリーの挑戦", + "description": "カチヌキファミリーは @[TOOLTIP_TITLE]{トレーナー5人の} 家族で、 勝負をしたい です! 連続で 全員に 勝つと、 特賞が もらえます。 最後まで 耐えられますか?", + "query": "どうしますか?", + "option": { + "1": { + "label": "挑戦を受け取る", + "tooltip": "(-) 5人との勝負が残酷\n(+) 特別なアイテムのご褒美", + "selected": "挑戦を 始めましょう!" + }, + "2": { + "label": "挑戦を断る", + "tooltip": "(+) 手持ちポケモンが全回復\n(+) ふかしぎなアメをもらう", + "selected": "残念ですね。 でもよ、 手持ちポケモンは 疲れている ようで、 ここで ちょっと 休みませんか?" + } + }, + "victory": "挑戦に 勝って おめでとうございます!$まずは、このクーポンを どうぞ!", + "victory_2": "また、 この家族は トレーニング中に ポケモンを より効果的に 強くする ために このきょうせいギプスを 使います。$私たち全員に 勝ったから 必要ないかもしれませんが とにかく 受け取って いただければ 嬉しいです!" +} diff --git a/src/locales/ja/mystery-encounters/training-session-dialogue.json b/src/locales/ja/mystery-encounters/training-session-dialogue.json index 9e26dfeeb6e..8e353692222 100644 --- a/src/locales/ja/mystery-encounters/training-session-dialogue.json +++ b/src/locales/ja/mystery-encounters/training-session-dialogue.json @@ -1 +1,33 @@ -{} \ No newline at end of file +{ + "intro": "特訓ツールと 備品を 見つけました。", + "title": "特訓セッション", + "description": "このツールと 備品で 手持ちポケモン 1匹を 特訓できる ようです!  @[TOOLTIP_TITLE]{他の 手持ちポケモンで 選んだポケモンを 倒すこと}により 特訓できます。", + "query": "どう特訓しますか?", + "invalid_selection": "ポケモンは 十分に 元気でなければ なりません。", + "option": { + "1": { + "label": "軽い特訓", + "tooltip": "(-) 選んだ ポケモンと 軽い バトル\n(+) 選んだポケモンの 2つの ランダムな 個体値を 恒久的に 上げる", + "finished": "戻ってから {{selectedPokemon}}は\n疲れ果てながらも 達成感が 感じています!${{stat1}}と {{stat2}}の 個体値は 強化されました!" + }, + "2": { + "label": "中程度の特訓", + "tooltip": "(-) 選んだ ポケモンと 中程度の バトル\n(+) 選んだ ポケモンの 性格を 恒久的に 変える", + "select_prompt": "新しい 性格を 選んでください", + "finished": "戻ってから {{selectedPokemon}}は\n疲れ果てながらも 達成感を 感じています!${{selectedPokemon}}の 性格は {{nature}}に 変化しました!" + }, + "3": { + "label": "激しい特訓", + "tooltip": "(-) 選んだ ポケモンと 激しい バトル\n(+) 選んだ ポケモンの 特性を 恒久的に 変える", + "select_prompt": "新しい 特性を 選んでください", + "finished": "戻ってから {{selectedPokemon}}は\n疲れ果てながらも 達成感を 感じています!${{selectedPokemon}}の 特性は {{ability}}に 変化しました!" + }, + "4": { + "label": "立ち去る", + "tooltip": "(-) ご褒美なし", + "selected": "特訓する 暇は ありません。\n行きましょう!" + }, + "selected": "{{selectedPokemon}}が 空き地を 横切って\n手持ちポケモンと 向き合います……" + }, + "outro": "効果的な 特訓セッション でした!" +} diff --git a/src/locales/ja/mystery-encounters/trash-to-treasure-dialogue.json b/src/locales/ja/mystery-encounters/trash-to-treasure-dialogue.json index 9e26dfeeb6e..72e777d081d 100644 --- a/src/locales/ja/mystery-encounters/trash-to-treasure-dialogue.json +++ b/src/locales/ja/mystery-encounters/trash-to-treasure-dialogue.json @@ -1 +1,19 @@ -{} \ No newline at end of file +{ + "intro": "巨大な ゴミの 山です!\nどこから 現れてきたの でしょう?", + "title": "余り物に福がある?", + "description": "天高く そびえ立つ ゴミの山の 中には 価値のありそうな アイテムが 数個 見えます。 しかし、 掘り出せば 散々 汚れるから 本当に いいですか?", + "query": "どうしますか?", + "option": { + "1": { + "label": "アイテムを掘り出す", + "tooltip": "(-) ショップで アイテムの 価格は {{costMultiplier}}倍\n(+) 素晴らしい アイテムを もらう", + "selected": "ゴミを 押し渡って 恐ろしく 汚れます。$こんなに 汚れた 人に 普段な価格で アイテムを 売る ショップの店員が いる わけじゃない ですよ……$今から ショップの アイテムは 高くなります。$しかし、 ゴミの 中で 素晴らしい アイテムを 見つけました!" + }, + "2": { + "label": "さらに調べる", + "tooltip": "(?) ゴミの 起源を 見つける", + "selected": "山の 周りを 歩き回り ゴミが どのようにして ここに 現れたのかを 示す 何かを 探します……", + "selected_2": "不意に、 ゴミは 動き出します! 結局 ただのゴミじゃなくて、 ポケモンでした!" + } + } +} diff --git a/src/locales/ko/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/ko/mystery-encounters/a-trainers-test-dialogue.json index 9b36aa0ff62..056c5213f93 100644 --- a/src/locales/ko/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/ko/mystery-encounters/a-trainers-test-dialogue.json @@ -31,7 +31,7 @@ "option": { "1": { "label": "승부한다", - "tooltip": "(-) 힘든 전투\n(+) @[TOOLTIP_TITLE]{매우 희귀한 알} 획득" + "tooltip": "(-) 매우 힘든 배틀\n(+) @[TOOLTIP_TITLE]{매우 희귀한 알} 획득" }, "2": { "label": "승부를 거절한다", diff --git a/src/locales/ko/mystery-encounters/clowning-around-dialogue.json b/src/locales/ko/mystery-encounters/clowning-around-dialogue.json index f1d8fed6fbf..d7a193f68ef 100644 --- a/src/locales/ko/mystery-encounters/clowning-around-dialogue.json +++ b/src/locales/ko/mystery-encounters/clowning-around-dialogue.json @@ -3,28 +3,28 @@ "speaker": "어릿광대", "intro_dialogue": "거기 있는 어리버리한 바보씨, 화려한 배틀을 맞이할 각오를 하시길!\n이 싸움꾼 광대가 당신을 쓰러트리겠습니다!", "title": "어릿광대의 장난", - "description": "이번 상대는 뭔가 이상합니다.\n어릿광대가 당신을 전투에 끌어들이고 싶어하는 것 같은데, 무슨 목적일까요?\n\n{{blacephalonName}}[[은]] 더욱 수상합니다.\n마치 @[TOOLTIP_TITLE]{이상한 타입과 능력}을 가진 것 같습니다.", + "description": "이번 상대는 뭔가 이상합니다.\n어릿광대가 당신을 배틀에 끌어들이고 싶어하는 것 같은데, 무슨 목적일까요?\n\n{{blacephalonName}}[[은]] 더욱 수상합니다.\n마치 @[TOOLTIP_TITLE]{이상한 타입과 능력}을 가진 것 같습니다.", "query": "어떻게 하시겠습니까?", "option": { "1": { "label": "어릿광대와 싸운다", - "tooltip": "(-) 이상한 배틀\n(?) 포켓몬의 특성 조정", + "tooltip": "(-) 이상한 배틀\n(?) 포켓몬 1마리의 특성 조정", "selected": "당신의 불쌍한 포켓몬들이 한심한 공연을 할 준비가 된 것 같군요!", - "apply_ability_dialogue": "센세이셔널한 쇼였습니다!\n당신의 멋진 기지에는 이 센세이셔널한 보상이 잘 어울릴 것 같군요!", + "apply_ability_dialogue": "센세이셔널한 쇼였습니다!\n당신의 멋진 기지에는 특별한 보상이 어울릴 것 같군요!", "apply_ability_message": "어릿광대가 포켓몬 한 마리의 특성을 영구적으로 {{ability}}로 교환해 주겠다고 제안했다!", "ability_prompt": "포켓몬의 특성을 영구적으로 {{ability}} 특성으로 바꾸시겠습니까?", "ability_gained": "@s{level_up_fanfare}{{chosenPokemon}}[[는]] {{ability}} 특성을 얻었다!" }, "2": { "label": "도발에 응하지 않는다", - "tooltip": "(-) 광대가 화를 냄\n(?) 포켓몬의 아이템 조정", + "tooltip": "(-) 포켓몬 1마리의 아이템 조정", "selected": "한심한 겁쟁이로군요? 즐거운 배틀을 거부하다니!\n이러면 한 방 먹이고 싶어지잖습니까!", "selected_2": "광대의 {{blacephalonName}}[[가]] 무언가 사용한 것 같다!\n{{switchPokemon}}의 모든 아이템이 랜덤하게 재조정된다!", "selected_3": "당황한 바보같은 표정! 완벽한 저의 한 수를 즐겨주시길!" }, "3": { "label": "조롱을 되돌려준다", - "tooltip": "(-) 광대가 화를 냄\n(?) 포켓몬의 타입 조정", + "tooltip": "(-) 멤버 포켓몬들의 타입 조정", "selected": "한심한 겁쟁이로군요? 즐거운 배틀을 거부하다니!\n이러면 한 방 먹이고 싶어지잖습니까!", "selected_2": "광대의 {{blacephalonName}}[[가]] 무언가 사용한 것 같다!\n멤버 포켓몬들의 타입이 랜덤하게 재조정된다!", "selected_3": "당황한 바보같은 표정! 완벽한 저의 한 수를 즐겨주시길!" diff --git a/src/locales/ko/mystery-encounters/dancing-lessons-dialogue.json b/src/locales/ko/mystery-encounters/dancing-lessons-dialogue.json index b96417274ff..c69be0917a5 100644 --- a/src/locales/ko/mystery-encounters/dancing-lessons-dialogue.json +++ b/src/locales/ko/mystery-encounters/dancing-lessons-dialogue.json @@ -1,7 +1,7 @@ { "intro": "{{oricorioName}}[[가]] 외로이 혼자 춤을 추고 있다.\n주변에 파트너도 없는 것 같다!", - "title": "댄스 댄스 레볼루션", - "description": "{{oricorioName}}[[는]] 공격적이진 않아 보입니다.\n오히려 슬퍼 보이기까지 하네요.\n\n그저 함께 춤출 누군가를\n원하고 있는지도 모릅니다….", + "title": "댄스 레슨", + "description": "{{oricorioName}}[[는]] 공격적이진 않아 보입니다.\n오히려 의기소침해 보이네요.\n\n아마도 함께 춤출 누군가를\n원하고 있는지도 모릅니다….", "query": "어떻게 하시겠습니까?", "option": { "1": { diff --git a/src/locales/ko/mystery-encounters/global-trade-system-dialogue.json b/src/locales/ko/mystery-encounters/global-trade-system-dialogue.json index a4e8c3a1dd1..fc2617565f9 100644 --- a/src/locales/ko/mystery-encounters/global-trade-system-dialogue.json +++ b/src/locales/ko/mystery-encounters/global-trade-system-dialogue.json @@ -11,13 +11,13 @@ }, "2": { "label": "미라클 교환을 한다", - "tooltip": "(+) 포켓몬 중 하나를 GTS에 보내고 랜덤한 포켓몬을 받는다" + "tooltip": "(+) 포켓몬 중 하나를 GTS에 보내는 대신 특별한 포켓몬을 랜덤하게 받는다" }, "3": { "label": "아이템을 교환한다", "trade_options_prompt": "교환할 아이템을 선택하세요.", "invalid_selection": "이 포켓몬은 교환할 아이템이 없습니다.", - "tooltip": "(+) 아이템 하나를 GTS에 보내고 랜덤한 아이템을 받는다" + "tooltip": "(+) 아이템 하나를 GTS에 보내는 대신 더 좋은 아이템을 랜덤하게 받는다" }, "4": { "label": "떠난다", diff --git a/src/locales/ko/mystery-encounters/safari-zone-dialogue.json b/src/locales/ko/mystery-encounters/safari-zone-dialogue.json index 4cdad3dd1ed..e14b75d0da9 100644 --- a/src/locales/ko/mystery-encounters/safari-zone-dialogue.json +++ b/src/locales/ko/mystery-encounters/safari-zone-dialogue.json @@ -1,7 +1,7 @@ { "intro": "사파리존이다!", "title": "사파리존", - "description": "여기에는 오만 가지 희귀하고 특별한 포켓몬들이 살고 있습니다! 특별한 포켓몬을 최대 3마리까지 만나고 잡을 기회가 있답니다.\n\n하지만 조심하세요! 잡기도 전에 포켓몬이 도망칠 수도 있으니까요!", + "description": "여기에는 오만 가지 희귀하고 특별한 포켓몬들이 살고 있습니다! 특별한 포켓몬을 최대 @[TOOLTIP_TITLE]{{{numEncounters}}마리}까지 만나고 잡을 기회가 있답니다.\n\n하지만 조심하세요! 잡기도 전에 포켓몬이 도망칠 수도 있으니까요!", "query": "들어가시겠습니까?", "option": { "1": { diff --git a/src/locales/ko/mystery-encounters/the-expert-pokemon-breeder-dialogue.json b/src/locales/ko/mystery-encounters/the-expert-pokemon-breeder-dialogue.json index e226741c60a..8c93868b4b4 100644 --- a/src/locales/ko/mystery-encounters/the-expert-pokemon-breeder-dialogue.json +++ b/src/locales/ko/mystery-encounters/the-expert-pokemon-breeder-dialogue.json @@ -26,7 +26,7 @@ "outro": "{{chosenPokemon}}[[가]] 정말 행복해 보이네요!$여기, 이것도 드릴게요.", "outro_failed": "실망이네요….$포켓몬의 신뢰를 얻으려면 아직 멀었어요!", "gained_eggs": "@s{item_fanfare}{{numEggs}}[[를]] 받았습니다!", - "eggs_tooltip": "\n(+) {{eggs}} 획득", + "eggs_tooltip": "\n(+) @[TOOLTIP_TITLE]{{{eggs}}} 획득", "numEggs_one": "{{rarity}}알 {{count}}개", "numEggs_other": "{{rarity}}알 {{count}}개" } diff --git a/src/locales/ko/mystery-encounters/the-pokemon-salesman-dialogue.json b/src/locales/ko/mystery-encounters/the-pokemon-salesman-dialogue.json index f5b35cb33cb..532b7c8c393 100644 --- a/src/locales/ko/mystery-encounters/the-pokemon-salesman-dialogue.json +++ b/src/locales/ko/mystery-encounters/the-pokemon-salesman-dialogue.json @@ -3,8 +3,8 @@ "speaker": "신사", "intro_dialogue": "거기, 안녕하신가!\n자네에게 좋은 거래를 제안하지!", "title": "포켓몬 상인", - "description": "\"이 {{purchasePokemon}}[[는]] 다른 평범한 {{purchasePokemon}}에서는 찾을 수 없는 매우 희귀한 특성을 갖고 있다네!\n내가 이 멋진 {{purchasePokemon}}[[를]] 자네에게 {{price, money}}에 주고 싶은데!\"\n\n\"어떻게 생각하는가?\"", - "description_shiny": "\"이 {{purchasePokemon}}[[는]] 다른 평범한 {{purchasePokemon}}에서는 볼 수 없는 매우 희귀한 색깔이라네!\n내가 이 멋진 {{purchasePokemon}}[[를]] 자네에게 {{price, money}}에 주고 싶은데!\"\n\n\"어떻게 생각하는가?\"", + "description": "\"이 {{purchasePokemon}}[[는]] 다른 평범한 {{purchasePokemon}}에서는 찾을 수 없는 @[TOOLTIP_TITLE]{매우 희귀한 특성}을 갖고 있다네!\n내가 이 멋진 {{purchasePokemon}}[[를]] 자네에게 {{price, money}}에 주고 싶은데!\"\n\n\"어떻게 생각하는가?\"", + "description_shiny": "\"이 {{purchasePokemon}}[[는]] 다른 평범한 {{purchasePokemon}}에서는 볼 수 없는 @[TOOLTIP_TITLE]{매우 희귀한 색깔}이라네!\n내가 이 멋진 {{purchasePokemon}}[[를]] 자네에게 {{price, money}}에 주고 싶은데!\"\n\n\"어떻게 생각하는가?\"", "query": "어떻게 하시겠습니까?", "option": { "1": { diff --git a/src/locales/ko/mystery-encounters/the-strong-stuff-dialogue.json b/src/locales/ko/mystery-encounters/the-strong-stuff-dialogue.json index 1563041e5bd..c275a5c114d 100644 --- a/src/locales/ko/mystery-encounters/the-strong-stuff-dialogue.json +++ b/src/locales/ko/mystery-encounters/the-strong-stuff-dialogue.json @@ -1,7 +1,7 @@ { "intro": "커다란 {{shuckleName}}를 만났다!\n옆에 한가득 차 있는 저건 주스…?", "title": "강력한 물질", - "description": "당신을 막아선 {{shuckleName}}[[는]] 엄청나게 강해보입니다. 게다가 그 옆에 있는 주스에서는 무언가 강한 기운이 느껴지는 것 같습니다.\n\n{{shuckleName}}가 당신 쪽으로 다리를 내밉니다.\n무언가 하려는 모양입니다…", + "description": "당신을 막아선 {{shuckleName}}[[는]] 엄청나게 강해보입니다. 게다가 그 옆에 있는 주스에서는 무언가 강한 기운이 뿜어져 나오는 것 같네요.\n\n{{shuckleName}}가 당신 쪽으로 다리를 내밉니다.\n무언가 하려는 모양입니다…", "query": "어떻게 하시겠습니까?", "option": { "1": { diff --git a/src/locales/ko/mystery-encounters/the-winstrate-challenge-dialogue.json b/src/locales/ko/mystery-encounters/the-winstrate-challenge-dialogue.json index b7b96926f57..99435f2f28a 100644 --- a/src/locales/ko/mystery-encounters/the-winstrate-challenge-dialogue.json +++ b/src/locales/ko/mystery-encounters/the-winstrate-challenge-dialogue.json @@ -1,14 +1,14 @@ { "intro": "한 가족이 집 앞에 모두 나와있다!", "speaker": "연승가족", - "intro_dialogue": "우리는 연승가족!$잠깐 어떤가?\n지금 여기서 우리 가족 4명과 포켓몬 승부를 겨뤄보지 않겠나?", + "intro_dialogue": "우리는 연승가족!$잠깐 어떤가?\n지금 여기서 우리 가족들과 포켓몬 승부를 겨뤄보지 않겠나?", "title": "연승가족", - "description": "모두 5명인 연승가족이 승부를 바라고 있습니다!\n가족 모두를 연달아 쓰러뜨릴 수 있다면 어마어마한 보상을 줄 겁니다.\n하지만 이걸 감당할 수 있을까요?", + "description": "모두 @[TOOLTIP_TITLE]{5명}인 연승가족이 승부를 바라고 있습니다!\n가족 모두를 연달아 쓰러뜨릴 수 있다면 어마어마한 보상을 줄 겁니다.\n하지만 이걸 감당할 수 있을까요?", "query": "어떻게 하시겠습니까?", "option": { "1": { "label": "승부한다", - "tooltip": "(-) 치열한 승부\n(+) 특별한 아이템 획득", + "tooltip": "(-) 5명과 치열한 배틀\n(+) 특별한 아이템 획득", "selected": "승부를 시작하지!" }, "2": { diff --git a/src/locales/ko/mystery-encounters/training-session-dialogue.json b/src/locales/ko/mystery-encounters/training-session-dialogue.json index fc9d6721c40..07fe9737c7a 100644 --- a/src/locales/ko/mystery-encounters/training-session-dialogue.json +++ b/src/locales/ko/mystery-encounters/training-session-dialogue.json @@ -1,24 +1,24 @@ { "intro": "훈련에 쓸 만한 물건들을 발견했다.", "title": "트레이닝 시간", - "description": "발견한 기구들은 포켓몬들을 훈련시키는 데 쓸 수 있을 것 같습니다!\n파티의 다른 포켓몬들과 싸우면서 원하는 방식으로 훈련해 보면 어떨까요?", + "description": "발견한 기구들은 포켓몬들을 훈련시키는 데 쓸 수 있을 것 같습니다!\n@[TOOLTIP_TITLE]{당신의 포켓몬 1마리를 상대로 하여, 나머지 포켓몬으로 배틀하고 쓰러뜨리며} 훈련해 보면 어떨까요?", "query": "어떻게 훈련할까요?", "invalid_selection": "포켓몬이 힘들어 보인다.", "option": { "1": { "label": "가벼운 트레이닝", - "tooltip": "(-) 쉬운 배틀 \n(+) 선택 포켓몬 무작위 개체치 2가지 향상", + "tooltip": "(-) 선택한 포켓몬과 쉬운 배틀 \n(+) 선택 포켓몬 무작위 개체치 2가지 영구 향상", "finished": "훈련을 마친 {{selectedPokemon}}[[는]] 조금 지쳤지만 뿌듯해 보인다!${{selectedPokemon}}의 {{stat1}}[[과]] {{stat2}}[[가]] 상승했다!" }, "2": { "label": "일반적인 트레이닝", - "tooltip": "(-) 평범한 배틀\n(+) 선택 포켓몬 성격 변경", + "tooltip": "(-) 선택한 포켓몬과 평범한 배틀\n(+) 선택 포켓몬 성격 영구 변경", "select_prompt": "포켓몬과 훈련할\n새로운 성격을 선택하세요.", "finished": "훈련을 마친 {{selectedPokemon}}[[는]] 조금 지쳤지만 뿌듯해 보인다!${{selectedPokemon}}의 성격이 {{nature}}[[로]] 바뀌었다!" }, "3": { "label": "고강도 트레이닝", - "tooltip": "(-) 힘든 배틀\n(+) 선택 포켓몬 특성 변경", + "tooltip": "(-) 선택한 포켓몬과 힘든 배틀\n(+) 선택 포켓몬 특성 영구 변경", "select_prompt": "포켓몬과 훈련할\n새로운 특성을 선택을 선택하세요.", "finished": "훈련을 마친 {{selectedPokemon}}[[는]] 조금 지쳤지만 뿌듯해 보인다!${{selectedPokemon}}의 특성이 {{ability}}[[로]] 바뀌었다!" }, diff --git a/src/locales/ko/mystery-encounters/trash-to-treasure-dialogue.json b/src/locales/ko/mystery-encounters/trash-to-treasure-dialogue.json index ac285692d23..1d523e65aa9 100644 --- a/src/locales/ko/mystery-encounters/trash-to-treasure-dialogue.json +++ b/src/locales/ko/mystery-encounters/trash-to-treasure-dialogue.json @@ -6,7 +6,7 @@ "option": { "1": { "label": "쓸만한 것을 발굴한다", - "tooltip": "(-) 회복 아이템 가격 3배 상승\n(+) 끝내주는 아이템들을 획득", + "tooltip": "(-) 회복 아이템 가격 {{costMultiplier}}배 상승\n(+) 끝내주는 아이템들을 획득", "selected": "쓰레기 더미를 헤집고 다니며 오물을 뒤집어썼다.$지금 이 상태라면 아무리 친절한 점원이라도\n물건을 제 가격에 안 팔 것 같다!$앞으로는 상점에서 파는 회복약을 훨씬 비싸게 사야 한다.$하지만 쓰레기에서 엄청난 물건들을 발견했다!" }, "2": { diff --git a/src/locales/pt_BR/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/pt_BR/mystery-encounters/a-trainers-test-dialogue.json index f80e7771cc1..2b81bb22975 100644 --- a/src/locales/pt_BR/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/a-trainers-test-dialogue.json @@ -31,7 +31,7 @@ "option": { "1": { "label": "Aceitar o Desafio", - "tooltip": "(-) Batalha Difícil\n(+) Ganhe um @[TOOLTIP_TITLE]{Ovo Muito Raro}" + "tooltip": "(-) Batalha Extremamente Difícil\n(+) Ganhe um @[TOOLTIP_TITLE]{Ovo Muito Raro}" }, "2": { "label": "Recusar o Desafio", diff --git a/src/locales/pt_BR/mystery-encounters/berries-abound-dialogue.json b/src/locales/pt_BR/mystery-encounters/berries-abound-dialogue.json index 5a3a30d0bd3..2ccd6ee888e 100644 --- a/src/locales/pt_BR/mystery-encounters/berries-abound-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/berries-abound-dialogue.json @@ -3,7 +3,7 @@ "title": "Frutas em Abundância", "description": "Parece que há um Pokémon forte guardando um arbusto de frutas. Batalhar é a abordagem mais direta, mas ele parece ser forte. Talvez um Pokémon rápido consiga pegar algumas frutas sem ser pego?", "query": "O que você vai fazer?", - "berries": "Frutas!", + "berries": "Frutas", "option": { "1": { "label": "Batalhar com o Pokémon", diff --git a/src/locales/pt_BR/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/pt_BR/mystery-encounters/bug-type-superfan-dialogue.json index 62244eee918..42c69b0452d 100644 --- a/src/locales/pt_BR/mystery-encounters/bug-type-superfan-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/bug-type-superfan-dialogue.json @@ -8,7 +8,7 @@ "option": { "1": { "label": "Oferecer uma Batalha", - "tooltip": "(-) Batalha Desafiadora\n(+) Ensinar um Movimento de Tipo Inseto a um Pokémon", + "tooltip": "(-) Batalha Desafiadora\n(+) Ensinar um Movimento de Tipo Inseto a qualquer Pokémon", "selected": "Um desafio, hein?\nMeus insetos estão mais do que prontos para você!" }, "2": { diff --git a/src/locales/pt_BR/mystery-encounters/clowning-around-dialogue.json b/src/locales/pt_BR/mystery-encounters/clowning-around-dialogue.json index 83bf85aa0f7..1f158cad8b6 100644 --- a/src/locales/pt_BR/mystery-encounters/clowning-around-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/clowning-around-dialogue.json @@ -8,23 +8,23 @@ "option": { "1": { "label": "Batalhar com o Palhaço", - "tooltip": "(-) Batalha Estranha\n(?) Afeta Habilidades dos Pokémon", + "tooltip": "(-) Batalha Estranha\n(?) Afeta a Habilidade de um Pokémon", "selected": "Seus Pokémon patéticos estão preparados para uma performance patética!", - "apply_ability_dialogue": "Um espetáculo sensacional!\nSeu conhecimento garante uma habilidade sensacional como recompensa!", + "apply_ability_dialogue": "Um espetáculo sensacional!\nSeu conhecimento garante uma habilidade especial como recompensa!", "apply_ability_message": "O palhaço está oferecendo para trocar permanentemente a habilidade de um dos seus Pokémon por {{ability}}!", "ability_prompt": "Você gostaria de ensinar permanentemente a habilidade {{ability}} a um Pokémon?", "ability_gained": "@s{level_up_fanfare}{{chosenPokemon}} adquiriu a habilidade {{ability}}!" }, "2": { - "label": "Não Se Provocar", - "tooltip": "(-) Irrita o Palhaço\n(?) Afeta os Itens dos Pokémon", + "label": "Não Ligar", + "tooltip": "(?) Afeta os Itens de um Pokémon", "selected": "Covarde dissimulado, você nega um duelo delicioso?\nSinta minha fúria!", "selected_2": "O {{blacephalonName}} do palhaço usa Trick!\nTodos os itens de {{switchPokemon}} foram trocados aleatoriamente!", "selected_3": "Tolo frustrado, caia na minha enganação impecável!" }, "3": { "label": "Retrucar os Insultos", - "tooltip": "(-) Irrita o Palhaço\n(?) Afeta os Tipos dos Pokémon", + "tooltip": "(?) Afeta os Tipos dos seus Pokémon", "selected": "Covarde dissimulado, você nega um duelo delicioso?\nSinta minha fúria!", "selected_2": "O {{blacephalonName}} do palhaço usa um movimento estranho!\nTodos os tipos da sua equipe foram trocados aleatoriamente!", "selected_3": "Tolo frustrado, caia na minha enganação impecável!" diff --git a/src/locales/pt_BR/mystery-encounters/dancing-lessons-dialogue.json b/src/locales/pt_BR/mystery-encounters/dancing-lessons-dialogue.json index 5769de91ea5..21c0d74248b 100644 --- a/src/locales/pt_BR/mystery-encounters/dancing-lessons-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/dancing-lessons-dialogue.json @@ -1,7 +1,7 @@ { "intro": "Um {{oricorioName}} dança tristemente sozinho, sem um parceiro.", "title": "Aulas de Dança", - "description": "O {{oricorioName}} não parece agressivo, na verdade parece triste.\n\nTalvez ele só queira alguém para dançar junto...", + "description": "O {{oricorioName}} não parece agressivo, na verdade parece desanimado.\n\nTalvez ele só queira alguém para dançar junto...", "query": "O que você vai fazer?", "option": { "1": { @@ -12,7 +12,7 @@ }, "2": { "label": "Aprender Sua Dança", - "tooltip": "(+) Ensinar Revelation Dance a um Pokémon", + "tooltip": "(+) Ensinar Revelation Dance a qualquer Pokémon", "selected": "Você observa o {{oricorioName}} de perto enquanto ele realiza sua dança...$@s{level_up_fanfare}Seu {{selectedPokemon}} aprendeu com o {{oricorioName}}!" }, "3": { diff --git a/src/locales/pt_BR/mystery-encounters/global-trade-system-dialogue.json b/src/locales/pt_BR/mystery-encounters/global-trade-system-dialogue.json index d9866d64c7f..f347610e61f 100644 --- a/src/locales/pt_BR/mystery-encounters/global-trade-system-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/global-trade-system-dialogue.json @@ -11,13 +11,13 @@ }, "2": { "label": "Troca Surpresa", - "tooltip": "(+) Envie um dos seus Pokémon para o GTS e receba um Pokémon aleatório em troca" + "tooltip": "(+) Envie um dos seus Pokémon para o GTS e receba um Pokémon especial aleatório em troca" }, "3": { "label": "Trocar um Item", "trade_options_prompt": "Selecione um item para enviar.", "invalid_selection": "Este Pokémon não possui itens válidos para troca.", - "tooltip": "(+) Envie um dos seus Itens para o GTS e receba um novo Item aleatório" + "tooltip": "(+) Envie um dos seus Itens para o GTS e receba um Item melhorado aleatório" }, "4": { "label": "Sair", diff --git a/src/locales/pt_BR/mystery-encounters/safari-zone-dialogue.json b/src/locales/pt_BR/mystery-encounters/safari-zone-dialogue.json index a43538e41f5..3ed055387fa 100644 --- a/src/locales/pt_BR/mystery-encounters/safari-zone-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/safari-zone-dialogue.json @@ -1,7 +1,7 @@ { "intro": "É uma zona de safári!", "title": "A Zona de Safári", - "description": "Há todos os tipos de Pokémon raros e especiais que podem ser encontrados aqui!\nSe você escolher entrar, terá um limite de tempo de 3 encontros selvagens onde poderá tentar capturar esses Pokémon especiais.\n\nCuidado, no entanto. Esses Pokémon podem fugir antes que você consiga capturá-los!", + "description": "Há todos os tipos de Pokémon raros e especiais que podem ser encontrados aqui!\nSe você escolher entrar, terá um limite de tempo de @[TOOLTIP_TITLE]{{{numEncounters}} encontros selvagens} onde poderá tentar capturar esses Pokémon especiais.\n\nCuidado, no entanto. Esses Pokémon podem fugir antes que você consiga capturá-los!", "query": "Você gostaria de entrar?", "option": { "1": { diff --git a/src/locales/pt_BR/mystery-encounters/the-expert-pokemon-breeder-dialogue.json b/src/locales/pt_BR/mystery-encounters/the-expert-pokemon-breeder-dialogue.json index d84c6c07273..7e48c9552da 100644 --- a/src/locales/pt_BR/mystery-encounters/the-expert-pokemon-breeder-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/the-expert-pokemon-breeder-dialogue.json @@ -25,7 +25,7 @@ "outro": "Veja como seu {{chosenPokemon}} está feliz agora!$Aqui, você também pode ficar com isso.", "outro_failed": "Que decepção...$Parece que você ainda tem um longo caminho\na percorrer para ganhar a confiança dos seus Pokémon!", "gained_eggs": "@s{item_fanfare}Você recebeu {{numEggs}}!", - "eggs_tooltip": "\n(+) Ganhe {{eggs}}", + "eggs_tooltip": "\n(+) Ganhe @[TOOLTIP_TITLE]{{{eggs}}}", "numEggs_one": "{{count}} Ovo {{rarity}}", "numEggs_other": "{{count}} Ovos {{rarity}}" } diff --git a/src/locales/pt_BR/mystery-encounters/the-pokemon-salesman-dialogue.json b/src/locales/pt_BR/mystery-encounters/the-pokemon-salesman-dialogue.json index 71467a78cf9..56b56494d0c 100644 --- a/src/locales/pt_BR/mystery-encounters/the-pokemon-salesman-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/the-pokemon-salesman-dialogue.json @@ -3,8 +3,8 @@ "speaker": "Cavalheiro", "intro_dialogue": "Olá! Tenho um negócio especialmente para VOCÊ!", "title": "O Vendedor de Pokémon", - "description": "\"Este {{purchasePokemon}} é extremamente único e possui uma habilidade que normalmente não é encontrada em sua espécie! Vou deixar você levar este ótimo {{purchasePokemon}} por apenas {{price, money}}!\"\n\n\"O que me diz?\"", - "description_shiny": "\"Este {{purchasePokemon}} é extremamente único e possui uma pigmentação que normalmente não é encontrada em sua espécie! Vou deixar você levar este ótimo {{purchasePokemon}} por apenas {{price, money}}!\"\n\n\"O que me diz?\"", + "description": "\"Este {{purchasePokemon}} é extremamente único e @[TOOLTIP_TITLE]{possui uma habilidade que normalmente não é encontrada em sua espécie}! Vou deixar você levar este ótimo {{purchasePokemon}} por apenas {{price, money}}!\"\n\n\"O que me diz?\"", + "description_shiny": "\"Este {{purchasePokemon}} é extremamente único e @[TOOLTIP_TITLE]{possui uma pigmentação que normalmente não é encontrada em sua espécie}! Vou deixar você levar este ótimo {{purchasePokemon}} por apenas {{price, money}}!\"\n\n\"O que me diz?\"", "query": "O que você vai fazer?", "option": { "1": { diff --git a/src/locales/pt_BR/mystery-encounters/the-strong-stuff-dialogue.json b/src/locales/pt_BR/mystery-encounters/the-strong-stuff-dialogue.json index 0d479cdc629..20135171bc3 100644 --- a/src/locales/pt_BR/mystery-encounters/the-strong-stuff-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/the-strong-stuff-dialogue.json @@ -1,7 +1,7 @@ { "intro": "É um enorme {{shuckleName}} e o que parece ser\na grande reserva de... suco?", "title": "O Suco Forte", - "description": "O {{shuckleName}} que bloqueia seu caminho parece incrivelmente forte. Enquanto isso, o suco ao lado dele está emanando algum tipo de poder.\n\nO {{shuckleName}} estende seus tentáculos na sua direção. Parece que ele quer fazer algo...", + "description": "O {{shuckleName}} que bloqueia seu caminho parece formidável. Enquanto isso, o suco ao lado dele emana algum tipo de poder.\n\nO {{shuckleName}} estende seus tentáculos na sua direção. Parece que ele quer fazer algo...", "query": "O que você vai fazer?", "option": { "1": { diff --git a/src/locales/pt_BR/mystery-encounters/the-winstrate-challenge-dialogue.json b/src/locales/pt_BR/mystery-encounters/the-winstrate-challenge-dialogue.json index 54a486be533..3b85aff33ac 100644 --- a/src/locales/pt_BR/mystery-encounters/the-winstrate-challenge-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/the-winstrate-challenge-dialogue.json @@ -3,12 +3,12 @@ "speaker": "Os Winstrates", "intro_dialogue": "Nós somos os Winstrates!$Que tal enfrentar nossa família em uma série de batalhas Pokémon?", "title": "O Desafio Winstrate", - "description": "Os Winstrates são uma família de 5 treinadores, e eles querem batalhar! Se você derrotar todos eles em sequência, receberá um grande prêmio. Mas será que você aguenta o desafio?", + "description": "Os Winstrates são uma família de @[TOOLTIP_TITLE]{5 treinadores}, e eles querem batalhar! Se você derrotar todos eles em sequência, receberá um grande prêmio. Mas será que você aguenta o desafio?", "query": "O que você vai fazer?", "option": { "1": { "label": "Aceitar o Desafio", - "tooltip": "(-) Batalha Brutal\n(+) Recompensa Especial de Item", + "tooltip": "(-) Batalha Brutal Contra 5 Treinadores\n(+) Recompensa Especial de Item", "selected": "Que comece o desafio!" }, "2": { diff --git a/src/locales/pt_BR/mystery-encounters/training-session-dialogue.json b/src/locales/pt_BR/mystery-encounters/training-session-dialogue.json index 6bb41058e01..484e7ebb134 100644 --- a/src/locales/pt_BR/mystery-encounters/training-session-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/training-session-dialogue.json @@ -1,24 +1,24 @@ { "intro": "Você encontrou algumas\nferramentas e suprimentos de treinamento.", "title": "Sessão de Treinamento", - "description": "Esses suprimentos parecem que poderiam ser usados para treinar um membro do seu time! Há algumas maneiras de treinar seu Pokémon, batalhando contra ele com o resto do seu time.", + "description": "Esses suprimentos parecem que poderiam ser usados para treinar um membro do seu time! Há algumas maneiras de treinar seu Pokémon, @[TOOLTIP_TITLE]{batalhando e derrotando-o com o resto do seu time}.", "query": "Como você deve treinar?", "invalid_selection": "O Pokémon precisa estar saudável o suficiente.", "option": { "1": { "label": "Treinamento Leve", - "tooltip": "(-) Batalha Leve\n(+) Melhorar 2 IVs Aleatórios do Pokémon", + "tooltip": "(-) Batalha Leve com o Pokémon Escolhido\n(+) Melhora Permanentemente 2 IVs Aleatórios do Pokémon Escolhido", "finished": "{{selectedPokemon}} retorna, sentindo-se\ncansado, mas realizado!$Seus IVs de {{stat1}} e {{stat2}} foram melhorados!" }, "2": { "label": "Treinamento Moderado", - "tooltip": "(-) Batalha Moderada\n(+) Mudar a Natureza do Pokémon", + "tooltip": "(-) Batalha Moderada com o Pokémon Escolhido\n(+) Muda Permanentemente a Natureza do Pokémon Escolhido", "select_prompt": "Selecione uma nova natureza\npara treinar seu Pokémon.", "finished": "{{selectedPokemon}} retorna, sentindo-se\ncansado, mas realizado!$Sua natureza foi alterada para {{nature}}!" }, "3": { "label": "Treinamento Intenso", - "tooltip": "(-) Batalha Rigorosa\n(+) Mudar a Habilidade do Pokémon", + "tooltip": "(-) Batalha Rigorosa com o Pokémon Escolhido\n(+) Muda Permanentemente a Habilidade do Pokémon Escolhido", "select_prompt": "Selecione uma nova habilidade\npara treinar seu Pokémon.", "finished": "{{selectedPokemon}} retorna, sentindo-se\ncansado, mas realizado!$Sua habilidade foi alterada para {{ability}}!" }, diff --git a/src/locales/pt_BR/mystery-encounters/trash-to-treasure-dialogue.json b/src/locales/pt_BR/mystery-encounters/trash-to-treasure-dialogue.json index 0af71ddf6ff..fbfd1d4fc2c 100644 --- a/src/locales/pt_BR/mystery-encounters/trash-to-treasure-dialogue.json +++ b/src/locales/pt_BR/mystery-encounters/trash-to-treasure-dialogue.json @@ -5,8 +5,8 @@ "query": "O que você vai fazer?", "option": { "1": { - "label": "Cavar em Busca de Valiosos", - "tooltip": "(-) Perder Itens de Cura nas Lojas\n(+) Ganhar Itens Incríveis", + "label": "Cavar em Busca de Objetos de Valor", + "tooltip": "(-) Itens na Loja Custarão {{costMultiplier}}x Mais\n(+) Ganhe Itens Incríveis", "selected": "Você vasculha a pilha de lixo, ficando preso na sujeira.$Não há como os lojistas respeitáveis\nvenderem algo para você nesse estado imundo!$Você terá que se virar sem itens de cura nas lojas.$No entanto, você encontrou alguns itens incríveis no lixo!" }, "2": { From 9a63a68d25dc76933a2e9310541d3d09eebc7baa Mon Sep 17 00:00:00 2001 From: Snailman11 Date: Wed, 25 Sep 2024 10:20:32 -0700 Subject: [PATCH 10/18] [P3] [Localization] Added Snow Worker Keys and Dialogue for En, Es, It, Fr, De, Ko, / Suppressed Female (#4373) * Added Snow Worker Dialogue Keys and Dialogue Includes en, fr, it, es, de, ko -placeholders for ja, pt_br, zh_cn, and zh_tw * Update dialogue.json * Added \n$ in Spanish and German so the textboxes don't overflow * Fixed "defeat" Formatting for Singles and Doubles English, and Doubles Korean, Italian, French, Japanese, and German * Fixed Formatting for English Singles "defeat", and Japanese Doubles "defeat" * Update src/locales/ko/dialogue.json Turns the periods into ellipses for Korean Snow worker Doubles Co-authored-by: returntoice <171243264+returntoice@users.noreply.github.com> * Update src/locales/ko/dialogue.json Adds a period to Korean Singles Defeat Co-authored-by: returntoice <171243264+returntoice@users.noreply.github.com> * Update dialogue.json * Update src/locales/ko/dialogue.json Adds a space on line 310 Co-authored-by: returntoice <171243264+returntoice@users.noreply.github.com> * Update src/locales/ja/dialogue.json Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Update src/locales/zh_TW/dialogue.json Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Update src/locales/zh_CN/dialogue.json Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Update src/locales/pt_BR/dialogue.json Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --------- Co-authored-by: Lugiad Co-authored-by: returntoice <171243264+returntoice@users.noreply.github.com> Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- public/images/trainer/snow_worker.json | 1637 ++++++++++++++++++++++++ public/images/trainer/snow_worker.png | Bin 0 -> 2658 bytes src/data/dialogue.ts | 19 + src/data/trainer-config.ts | 2 +- src/locales/de/dialogue.json | 22 + src/locales/en/dialogue.json | 22 + src/locales/es/dialogue.json | 22 + src/locales/fr/dialogue.json | 22 + src/locales/it/dialogue.json | 24 +- src/locales/ko/dialogue.json | 22 + 10 files changed, 1790 insertions(+), 2 deletions(-) create mode 100644 public/images/trainer/snow_worker.json create mode 100644 public/images/trainer/snow_worker.png diff --git a/public/images/trainer/snow_worker.json b/public/images/trainer/snow_worker.json new file mode 100644 index 00000000000..0c1a21133b9 --- /dev/null +++ b/public/images/trainer/snow_worker.json @@ -0,0 +1,1637 @@ +{ + "textures": [ + { + "image": "snow_worker_m.png", + "format": "RGBA8888", + "size": { + "w": 183, + "h": 183 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 47, + "h": 60 + }, + "frame": { + "x": 1, + "y": 1, + "w": 47, + "h": 60 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 46, + "h": 60 + }, + "frame": { + "x": 1, + "y": 63, + "w": 46, + "h": 60 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 46, + "h": 60 + }, + "frame": { + "x": 1, + "y": 63, + "w": 46, + "h": 60 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 20, + "w": 46, + "h": 60 + }, + "frame": { + "x": 1, + "y": 63, + "w": 46, + "h": 60 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 49, + "y": 63, + "w": 46, + "h": 59 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 49, + "y": 63, + "w": 46, + "h": 59 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 50, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 50, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 50, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 98, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 98, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 98, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 98, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 98, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 98, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 98, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 98, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 98, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 98, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 98, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 98, + "y": 1, + "w": 46, + "h": 59 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 97, + "y": 62, + "w": 46, + "h": 59 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 97, + "y": 62, + "w": 46, + "h": 59 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 97, + "y": 62, + "w": 46, + "h": 59 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 97, + "y": 62, + "w": 46, + "h": 59 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 97, + "y": 62, + "w": 46, + "h": 59 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 97, + "y": 123, + "w": 46, + "h": 59 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 97, + "y": 123, + "w": 46, + "h": 59 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 21, + "w": 46, + "h": 59 + }, + "frame": { + "x": 97, + "y": 123, + "w": 46, + "h": 59 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:c523abd1fb0f9a15c395d98cc94abb21:5b387f1394fa7c00ff021a434a2c70e2:dd52c0c753a2ab4cf10a366fabd9abcb$" + } +} diff --git a/public/images/trainer/snow_worker.png b/public/images/trainer/snow_worker.png new file mode 100644 index 0000000000000000000000000000000000000000..0e39505cc8de1e8569b0fbdd076d824e82114ca1 GIT binary patch literal 2658 zcmV-o3Z3clzU2AoO2MZLPEWJW8S5E_q7QB*1iA#|Cha=dH?_b0d!JM zQvg8b*k%9#010qNS#tmY3ljhU3ljkVnw%H_013`XL_t(|+U=Z)lAJgUKwCCFAqms} z|GDcEU-BV?yi8T7t@NZ;63++N&~Ng3{X72OW8ZgB2W!g2Il2`Od%S@yW#Sy&l83K( z9Ke(^agKqSq3D|_W#SwICF#9KOqn=G_jn(1QD8}#ILBDc!(BJ~P*HNq#5o3Q>Zgl2xHr5;d+R9SY z-R<-Fr9es!mysqk;zzJ8g92BF>i6VIx8sPW7>+bWb9{awO|2wU<43U_`Imu*sJHDn zmN{nBRcM-`?#`bNs6PRnCE!kSCRF2xxE+Hnsy;;6Qn+zU!G+jh(}x2&F?Mr*E>}a9 zU=MgF3AOma+3gri_vw-nVs0~z3B?u;utN{Jt>^YyeZDFQ5G7ROM-Gt`HT@xXKWsZX zjxo2-0V!nIHD$wICTQ+@{0R28rA2p*E#x_j#W;oxp+*X9j>6u;_Bvg{MHX*oS3RD_ zE&Oy*ovr##b;mi3x_rj1M#&76kOpSge>pkQ`;U+&VK|l19NO_Kuj6clXLI3ZR1EPeH_z~=) zFV5bGh7rXO5r+TNeTQ(E1Va44El`Gx=M{8%DrZDvZMno;qMK9%}Jp;03q;(as{IDs0=9-T0*o z*9V$FiXU9&1;(w{5_QN5H*EQe1@+kq#P~6AS5u1GKJ2k~tasxH~`rDH*x$Wf8+%VLAaRwp2-!n99*X63L z{ysz0;M0rPWVBnFouS)KI=8-IOHIAo3lm#)%mth$*p}i=%@b_TT%IT*+6tQf&}D^L zf;D+{wwhJiC-{cq@lx9OEl$wwyo4=1#ulD0oSqhrdvN=y7d9uV$~#Wc6;4{50FWEG8$*uikf^LxlR0ZB3O#}UP!v&53mO%q!-aF`uWtGo5` ze}uzq>>2}v#6x;DOx?gizvYUmx@~u3me?1VwxhFn4BNyT@(>S~XSc8CIKufw& zJk26!pIFZL>MYsqoJiy0>P4wv(Fym&B;y0{*8{4B!tG;{S2uc<2eiBM_-uUU7EAMn zxB`N91RUbsN)Wd>jr}_TT1uY=KlbeET4bev{k9cf%>%dkduCFz;t|jNA8u zf0={73(4a{_%&`LYBfNRRmX^QVmluNT#H5R9bOV2!mqvZ0o$ttke59l0K{K8G!TmT zb~xpmdG|R8l79m{+;PNkS{n$Je=7IC0IXIH0hRMTjrQ zokQzQIlu|YO^(O}J}KnsQLBN^$DKjz%{UZDmjknrrJYIM15U=BMeEHuw#1~yI6^D! zD0zc9_J9)&xUco@*RY2;ya=qj&x*ic-+d<@aO%@`wBD(^V9BwyIJ}MQK%5BN@__qV z@BAzo=YYhbj_i-R2i(S&wL8SIVGLWq3uBFSP^^!qQ8+lMizESI~fxsY!^OudWQn@NwwBCkDUDJy(f4M4V zFloK7wn$xCppge0`O97fUZ(ZdKt#=?#&l#IErhIuvuM3Fkg7>7N*%eScrt0dO%SX{ zFdaFuUDs&6O%QD05gqw7Q;~2kt+x$=c)Ezc+zRK?dUJig^rDN$w5_2dFVlLvAeH`0 zbma9~F9Oo`*7u{OBd^kWOCR|#zmO>E95ID^ZWgPx-oi)rzZYIB3Z_}(Ix>^ioBPPe z`AVb7QPYuEX}yJy46-d!w{_%YT5rckMt(25sUt7bdOJRHhoi3}GikkKA9+$ozFX@h z`^aP+nMdm-`^Z!snN91Z`p8rrnM>=X`^Z!sx%kHTCSPXWM}CafOC))Y1^mxPZtN@e zAJ{ECUN1j3i`Tn?o5Sl}f&C*poX6{3#C^NhyNdg6uXh>u&0g;UZWgb1!8U@$>s`TJ z^Ln3+-SB!JjotEkpNq}o^{(36-|Y2rA6#B9H#V2oyN>%#uXh#o&0a4zcHirL=AESL z^*;0_*zwWY?L*t+8eL6Sl z^}_S9QLp#mkHlPF@2c*;+v{D`-FJJv>$q?AdfBm=yk7R+X7YL$%n}Z-cj4r|)$3i# zeWTaAl>0ufm;dRK$LnS0=JI;E4=%5l`C#*UxgRZ=yk73v&E)lR&k`oDm;YwMKdN%bhFwl; Q1ONa407*qoM6N<$f{s5!z5oCK literal 0 HcmV?d00001 diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index 499cd106cf9..cf693a6315c 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -353,6 +353,25 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] }, ], + // Defeat dialogue in the language .JSONS exist as translated or placeholders; (en, fr, it, es, de, ja, ko, zh_cn, zh_tw, pt_br) + [TrainerType.SNOW_WORKER]: [ + { + encounter: [ + "dialogue:snow_worker.encounter.1", + ], + victory: [ + "dialogue:snow_worker.victory.1", + ] + }, + { + encounter: [ + "dialogue:snow_worker_double.encounter.1", + ], + victory: [ + "dialogue:snow_worker_double.victory.1", + ] + }, + ], [TrainerType.HEX_MANIAC]: [ { encounter: [ diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 82593a4e08b..75a849574ea 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1458,7 +1458,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.ULTRA_RARE]: [Species.ROTOM, Species.MELTAN] }), [TrainerType.SMASHER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), - [TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName("Worker").setHasGenders("Worker Female").setHasDouble("Workers").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(Type.ICE) || s.isOfType(Type.STEEL)), + [TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName("Worker").setHasDouble("Workers").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(Type.ICE) || s.isOfType(Type.STEEL)), [TrainerType.STRIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.SCHOOL_KID]: new TrainerConfig(++t).setMoneyMultiplier(0.75).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("School Kid Female", "lass").setHasDouble("School Kids") .setSpeciesPools({ diff --git a/src/locales/de/dialogue.json b/src/locales/de/dialogue.json index 493ccef2976..fe7e37c1413 100644 --- a/src/locales/de/dialogue.json +++ b/src/locales/de/dialogue.json @@ -299,6 +299,28 @@ "1": "Wie seltsam… Wie konnte das passieren… Ich hätte nicht ausgemuskelt werden sollen." } }, + "snow_worker": { + "encounter": { + "1": "Wenn es kalt wird, zieh dich warm an!\n$Das sagt uns der gesunde Menschenverstand." + }, + "victory": { + "1": "Sich bis zum Gehtnichtmehr abzurackern, ist wohl auch eine Eigenart, die uns der gesunde Menschenverstand diktiert." + }, + "defeat": { + "1": "Lass mich dir einen Ratschlag geben. Ist ein Pokémon gefroren, kannst du es wieder auftauen,\n$indem du eine Attacke vom Typ Feuer auf es anwendest!" + } + }, + "snow_worker_double": { + "encounter": { + "1": "L-l-lass uns kämpfen!" + }, + "victory": { + "1": "M-m-mir sch-sch-schlottern die K-k-knie vor lauter K-k-kälte!" + }, + "defeat": { + "1": "...\n$Sch-sch-schon gemerkt?\nH-h-hier ist es k-k-kalt!" + } + }, "hex_maniac": { "encounter": { "1": "Ich höre normalerweise nur klassische Musik, aber wenn ich verliere,\n$werde ich ein bisschen New Age ausprobieren!", diff --git a/src/locales/en/dialogue.json b/src/locales/en/dialogue.json index 9d1f0ae1c80..757e4f1020b 100644 --- a/src/locales/en/dialogue.json +++ b/src/locales/en/dialogue.json @@ -316,6 +316,28 @@ "1": "How strange… How could this be… I shouldn't have been outmuscled." } }, + "snow_worker": { + "encounter": { + "1": "When it's cold, wear a lot of clothes!\n$Only humans could come up with something so clever!" + }, + "victory": { + "1": "How we struggle in vain at the end also shows how clever humans are!" + }, + "defeat": { + "1": "I'll tell you something clever. If you use a Fire-type move on a Pokémon that is frozen solid, the ice will melt!" + } + }, + "snow_worker_double": { + "encounter": { + "1": "...\n$...R-ready to b-battle?" + }, + "victory": { + "1": "...\n$...I'm sh-shivering!" + }, + "defeat": { + "1": "...\n$...Kn-know what?\n...Th-this place is cold." + } + }, "hex_maniac": { "encounter": { "1": "I normally only ever listen to classical music, but if I lose, I think I shall try a bit of new age!", diff --git a/src/locales/es/dialogue.json b/src/locales/es/dialogue.json index 167ab60b10e..1ee842abae7 100644 --- a/src/locales/es/dialogue.json +++ b/src/locales/es/dialogue.json @@ -1,4 +1,26 @@ { + "snow_worker": { + "encounter": { + "1": "¡Cuando hace frío, hay que abrigarse!\n$¡Sabiduría popular!" + }, + "victory": { + "1": "De donde no hay, no se puede sacar.\nEso también es sabiduría popular, creo." + }, + "defeat": { + "1": "¡Voy a compartir mi sabiduría! Si congelan a un Pokémon de tu equipo,\n$usa con él un movimiento de tipo Fuego ¡y podrás derretir el hielo!" + } + }, +"snow_worker_double": { + "encounter": { + "1": "...\n$¡Co-combate!" + }, + "victory": { + "1": "...\n$¡Qué-qué frío!" + }, + "defeat": { + "1": "¿Sabes?\nAquí hace mucho frío." + } + }, "aether_grunt": { "encounter": { "1": "¡Lucharé con toda mi fuerza para detenerte!", diff --git a/src/locales/fr/dialogue.json b/src/locales/fr/dialogue.json index 3b362fc0c2c..72ceeda384d 100644 --- a/src/locales/fr/dialogue.json +++ b/src/locales/fr/dialogue.json @@ -175,6 +175,28 @@ "1": "Mon élégance demeure inébranlable !" } }, + "snow_worker": { + "encounter": { + "1": "Quand il fait froid, on se couvre !\nTout le monde sait ça !" + }, + "victory": { + "1": "Il faut se rebeller jusqu’au bout !\nTout le monde sait ça aussi…" + }, + "defeat": { + "1": "Je vais t’apprendre une bonne chose. Si un Pokémon est gelé, utilise une capacité Feu pour faire fondre la glace !" + } + }, + "snow_worker_double": { + "encounter": { + "1": "…\n… En-en-en garde !" + }, + "victory": { + "1": "…\n… Je-je-je tremble…" + }, + "defeat": { + "1": "…\n… Tu-tu-tu sais quoi ?\n… Il fait su-super froid i-ici." + } + }, "rocket_grunt": { "encounter": { "1": "Nous sommes de retour !", diff --git a/src/locales/it/dialogue.json b/src/locales/it/dialogue.json index dd82247493b..d44c0f1f245 100644 --- a/src/locales/it/dialogue.json +++ b/src/locales/it/dialogue.json @@ -1,4 +1,26 @@ { + "snow_worker": { + "encounter": { + "1": "Col freddo ci vogliono vestiti pesanti!\n$Questa è saggezza! Viva l'intelletto!" + }, + "victory": { + "1": "Agitarsi quando è troppo tardi è inutile.\nAnche questa è saggezza." + }, + "defeat": { + "1": "Ascolta questa perla di saggezza! Se usi delle mosse di tipo Fuoco su un Pokémon congelato, questo si riprenderà." + } + }, + "snow_worker_double": { + "encounter": { + "1": "...\n$Lo-Lo-Lotta..." + }, + "victory": { + "1": "...\n$Tre-Tremo..." + }, + "defeat": { + "1": "...\n$Sai che-che...\nQui fa-fa freddo?" + } + }, "stat_trainer_buck": { "encounter": { "1": "...I'm telling you right now. I'm seriously tough. Act surprised!", @@ -109,4 +131,4 @@ "1": "I was better than everyone in my family.\nI've never lost before..." } } -} +} \ No newline at end of file diff --git a/src/locales/ko/dialogue.json b/src/locales/ko/dialogue.json index 3b998c8e218..b0d8d43c9f0 100644 --- a/src/locales/ko/dialogue.json +++ b/src/locales/ko/dialogue.json @@ -299,6 +299,28 @@ "1": "이상하네… 어떻게 이럴 수 있지… 힘으로 압도할 수 없다니." } }, + "snow_worker": { + "encounter": { + "1": "추울 때엔 두껍게 입는다!\n$ 이것이 인간의 지혜다!" + }, + "victory": { + "1": "하다 하다 안 되면 마지막에는 발버둥 이것도 인간의 지혜일지도..." + }, + "defeat": { + "1": "너에게 지혜를 나누어주지. 얼음 상태가 된 포켓몬에게 불꽃 타입 기술을 쓰면 얼음이 녹는다고!" + } + }, + "snow_worker_double": { + "encounter": { + "1": "… … …\n$… …스 승부" + }, + "victory": { + "1": "… … …\n$… …떠 떨려" + }, + "defeat": { + "1": "…\n$… …알고 있니?\n… …여기 춥다고" + } + }, "hex_maniac": { "encounter": { "1": "평소에는 클래식 음악만 들었는데, 지면 뉴에이지도 좀 들어볼까!", From 83c18af50f4386c01dbd0637c6ba18f519e9551d Mon Sep 17 00:00:00 2001 From: Enoch Date: Thu, 26 Sep 2024 03:02:38 +0900 Subject: [PATCH 11/18] [Localization] localize reward gain with hard-coded numBerries(item count) in ME. (#4379) * localize hard-coded numBerries * Update src/locales/zh_CN/battle.json Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/zh_TW/battle.json Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * change 'rewardCount' to 'count' (flx's review) * Apply suggestions from code review - count Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Revert "Apply suggestions from code review - count" This reverts commit 3ce0805a5c96fb2d4727d75d2682e57e31809fe6. * Apply suggestions from code review Co-authored-by: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> * change count to parameter in trash-to-treasure * change key --------- Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: Lugiad Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> Co-authored-by: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> --- .../encounters/berries-abound-encounter.ts | 12 ++++++------ .../encounters/trash-to-treasure-encounter.ts | 4 ++-- src/locales/de/battle.json | 1 + src/locales/en/battle.json | 1 + src/locales/es/battle.json | 1 + src/locales/fr/battle.json | 1 + src/locales/it/battle.json | 1 + src/locales/ja/battle.json | 1 + src/locales/ko/battle.json | 1 + src/locales/pt_BR/battle.json | 1 + src/locales/zh_CN/battle.json | 1 + src/locales/zh_TW/battle.json | 1 + 12 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts index 4cc5edc5208..a112355b033 100644 --- a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts +++ b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts @@ -128,10 +128,10 @@ export const BerriesAboundEncounter: MysteryEncounter = const numBerries = encounter.misc.numBerries; const doBerryRewards = () => { - const berryText = numBerries + " " + i18next.t(`${namespace}.berries`); + const berryText = i18next.t(`${namespace}.berries`); scene.playSound("item_fanfare"); - queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText })); + queueEncounterMessage(scene, i18next.t("battle:rewardGainCount", { modifierName: berryText, count: numBerries })); // Generate a random berry and give it to the first Pokemon with room for it for (let i = 0; i < numBerries; i++) { @@ -179,10 +179,10 @@ export const BerriesAboundEncounter: MysteryEncounter = if (speedDiff < 1) { // Caught and attacked by boss, gets +1 to all stats at start of fight const doBerryRewards = () => { - const berryText = numBerries + " " + i18next.t(`${namespace}.berries`); + const berryText = i18next.t(`${namespace}.berries`); scene.playSound("item_fanfare"); - queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText })); + queueEncounterMessage(scene, i18next.t("battle:rewardGainCount", { modifierName: berryText, count: numBerries })); // Generate a random berry and give it to the first Pokemon with room for it for (let i = 0; i < numBerries; i++) { @@ -210,10 +210,10 @@ export const BerriesAboundEncounter: MysteryEncounter = const numBerriesGrabbed = Math.max(Math.min(Math.round((speedDiff - 1)/0.08), numBerries), 2); encounter.setDialogueToken("numBerries", String(numBerriesGrabbed)); const doFasterBerryRewards = () => { - const berryText = numBerriesGrabbed + " " + i18next.t(`${namespace}.berries`); + const berryText = i18next.t(`${namespace}.berries`); scene.playSound("item_fanfare"); - queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText })); + queueEncounterMessage(scene, i18next.t("battle:rewardGainCount", { modifierName: berryText, count: numBerriesGrabbed })); // Generate a random berry and give it to the first Pokemon with room for it (trying to give to fastest first) for (let i = 0; i < numBerriesGrabbed; i++) { diff --git a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts index 83ec3e1e4e9..98aa90c0818 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -190,7 +190,7 @@ async function tryApplyDigRewardItems(scene: BattleScene) { } scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2x " + leftovers.name }), null, undefined, true); + await showEncounterText(scene, i18next.t("battle:rewardGainCount", { modifierName: leftovers.name, count: 2 }), null, undefined, true); // First Shell bell for (const pokemon of party) { @@ -217,7 +217,7 @@ async function tryApplyDigRewardItems(scene: BattleScene) { } scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2x " + shellBell.name }), null, undefined, true); + await showEncounterText(scene, i18next.t("battle:rewardGainCount", { modifierName: shellBell.name, count: 2 }), null, undefined, true); } async function doGarbageDig(scene: BattleScene) { diff --git a/src/locales/de/battle.json b/src/locales/de/battle.json index 93b30e10fe5..0a2bc4dc5d8 100644 --- a/src/locales/de/battle.json +++ b/src/locales/de/battle.json @@ -32,6 +32,7 @@ "attackMissed": "Die Attacke hat {{pokemonNameWithAffix}} verfehlt!", "attackHitsCount": "{{count}}-mal getroffen!", "rewardGain": "Du erhältst {{modifierName}}!", + "rewardGainCount": "Du erhältst {{count}} {{modifierName}}!", "expGain": "{{pokemonName}} erhält {{exp}} Erfahrungspunkte!", "levelUp": "{{pokemonName}} erreicht Lv. {{level}}!", "learnMove": "{{pokemonName}} erlernt {{moveName}}!", diff --git a/src/locales/en/battle.json b/src/locales/en/battle.json index 2559dafecae..609b1b1ea49 100644 --- a/src/locales/en/battle.json +++ b/src/locales/en/battle.json @@ -32,6 +32,7 @@ "attackMissed": "{{pokemonNameWithAffix}} avoided the attack!", "attackHitsCount": "Hit {{count}} time(s)!", "rewardGain": "You received\n{{modifierName}}!", + "rewardGainCount": "You received\n{{count}} {{modifierName}}!", "expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!", "levelUp": "{{pokemonName}} grew to\nLv. {{level}}!", "learnMove": "{{pokemonName}} learned\n{{moveName}}!", diff --git a/src/locales/es/battle.json b/src/locales/es/battle.json index 4abd5054bc0..86c5c3b751d 100644 --- a/src/locales/es/battle.json +++ b/src/locales/es/battle.json @@ -32,6 +32,7 @@ "attackMissed": "¡{{pokemonNameWithAffix}}\nha evitado el ataque!", "attackHitsCount": "N.º de golpes: {{count}}.", "rewardGain": "¡Has conseguido\n{{modifierName}}!", + "rewardGainCount": "¡Has conseguido\n{{count}} {{modifierName}}!", "expGain": "{{pokemonName}} ha ganado\n{{exp}} puntos de experiencia.", "levelUp": "¡{{pokemonName}} ha subido a\nNv. {{level}}!", "learnMove": "¡{{pokemonName}} ha aprendido {{moveName}}!", diff --git a/src/locales/fr/battle.json b/src/locales/fr/battle.json index 26b46f77e9d..189940d3229 100644 --- a/src/locales/fr/battle.json +++ b/src/locales/fr/battle.json @@ -32,6 +32,7 @@ "attackMissed": "{{pokemonNameWithAffix}}\névite l’attaque !", "attackHitsCount": "Touché {{count}} fois !", "rewardGain": "Vous recevez\n{{modifierName}} !", + "rewardGainCount": "Vous recevez\n{{count}} {{modifierName}} !", "expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !", "levelUp": "{{pokemonName}} monte au\nN. {{level}} !", "learnMove": "{{pokemonName}} apprend\n{{moveName}} !", diff --git a/src/locales/it/battle.json b/src/locales/it/battle.json index e11399dff6c..e5a45a6e5e6 100644 --- a/src/locales/it/battle.json +++ b/src/locales/it/battle.json @@ -32,6 +32,7 @@ "attackMissed": "{{pokemonNameWithAffix}}\nevita l’attacco!", "attackHitsCount": "Colpito {{count}} volta/e!", "rewardGain": "Ricevi\n{{modifierName}}!", + "rewardGainCount": "Ricevi\n{{count}} {{modifierName}}!", "expGain": "{{pokemonName}} ha guadagnato\n{{exp}} Punti Esperienza!", "levelUp": "{{pokemonName}} è salito al\nlivello {{level}}!", "learnMove": "{{pokemonName}} impara\n{{moveName}}!", diff --git a/src/locales/ja/battle.json b/src/locales/ja/battle.json index 7402c6155b4..f01ab2a5208 100644 --- a/src/locales/ja/battle.json +++ b/src/locales/ja/battle.json @@ -28,6 +28,7 @@ "attackMissed": "{{pokemonNameWithAffix}}には 当たらなかった!", "attackHitsCount": "{{count}}かい 当たった!", "rewardGain": "{{modifierName}}を 手に入れた!", + "rewardGainCount": "{{modifierName}}を {{count}}個 手に入れた!", "expGain": "{{pokemonName}}は\n{{exp}}経験値を もらった!", "levelUp": "{{pokemonName}}は\nレベル{{level}}に 上がった!", "learnMove": "{{pokemonName}}は 新しく\n{{moveName}}を 覚えた!", diff --git a/src/locales/ko/battle.json b/src/locales/ko/battle.json index 987f816bbf6..321684ebe81 100644 --- a/src/locales/ko/battle.json +++ b/src/locales/ko/battle.json @@ -32,6 +32,7 @@ "attackMissed": "{{pokemonNameWithAffix}}에게는\n맞지 않았다!", "attackHitsCount": "{{count}}번 맞았다!", "rewardGain": "{{modifierName}}[[를]] 받았다!", + "rewardGainCount": "{{modifierName}}[[를]]\n{{count}}개 손에 넣었다!", "expGain": "{{pokemonName}}[[는]]\n{{exp}} 경험치를 얻었다!", "levelUp": "{{pokemonName}}[[는]]\n레벨 {{level}}[[로]] 올랐다!", "learnMove": "{{pokemonName}}[[는]] 새로\n{{moveName}}[[를]] 배웠다!", diff --git a/src/locales/pt_BR/battle.json b/src/locales/pt_BR/battle.json index 72fcc018980..e3de22357cb 100644 --- a/src/locales/pt_BR/battle.json +++ b/src/locales/pt_BR/battle.json @@ -32,6 +32,7 @@ "attackMissed": "{{pokemonNameWithAffix}} desviou do ataque!", "attackHitsCount": "Acertou {{count}} vezes.", "rewardGain": "Você recebeu\n{{modifierName}}!", + "rewardGainCount": "Você recebeu\n{{count}} {{modifierName}}!", "expGain": "{{pokemonName}} ganhou\n{{exp}} pontos de experiência.", "levelUp": "{{pokemonName}} subiu para \nNv. {{level}}!", "learnMove": "{{pokemonName}} aprendeu {{moveName}}!", diff --git a/src/locales/zh_CN/battle.json b/src/locales/zh_CN/battle.json index 355c253676d..ef716b0893a 100644 --- a/src/locales/zh_CN/battle.json +++ b/src/locales/zh_CN/battle.json @@ -32,6 +32,7 @@ "attackMissed": "没有命中{{pokemonNameWithAffix}}!", "attackHitsCount": "击中{{count}}次!", "rewardGain": "你获得了\n{{modifierName}}!", + "rewardGainCount": "你获得了\n{{count}}个{{modifierName}}!", "expGain": "{{pokemonName}}获得了{{exp}} 点经验值!", "levelUp": "{{pokemonName}}升级到Lv.{{level}}!", "learnMove": "{{pokemonName}}学会了{{moveName}}!", diff --git a/src/locales/zh_TW/battle.json b/src/locales/zh_TW/battle.json index 3eb9d523b03..2e9d2f52826 100644 --- a/src/locales/zh_TW/battle.json +++ b/src/locales/zh_TW/battle.json @@ -39,6 +39,7 @@ "attackMissed": "沒有命中{{pokemonNameWithAffix}}!", "attackHitsCount": "擊中{{count}}次!", "rewardGain": "你獲得了\n{{modifierName}}!", + "rewardGainCount": "你獲得了\n{{count}}個{{modifierName}}!", "expGain": "{{pokemonName}}獲得了{{exp}} 點經驗值!", "levelUp": "{{pokemonName}}升級到Lv.{{level}}!", "learnMove": "{{pokemonName}}學會了{{moveName}}!", From acc1ef4added54464f0c709d24bb6152e9cbe723 Mon Sep 17 00:00:00 2001 From: Enoch Date: Thu, 26 Sep 2024 04:37:49 +0900 Subject: [PATCH 12/18] fix Korean i18n param case (#4431) --- src/locales/ko/battle.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/ko/battle.json b/src/locales/ko/battle.json index 321684ebe81..1a85ac9d948 100644 --- a/src/locales/ko/battle.json +++ b/src/locales/ko/battle.json @@ -69,7 +69,7 @@ "turnEndHpRestore": "{{pokemonName}}의\n체력이 회복되었다!", "hpIsFull": "그러나 {{pokemonName}}의\n체력이 가득 찬 상태다!", "skipItemQuestion": "아이템을 받지 않고 넘어가시겠습니까?", - "itemStackFull": "{{fullItemName}}의 소지 한도에 도달했습니다.\n{{itemname}}[[를]] 대신 받습니다.", + "itemStackFull": "{{fullItemName}}의 소지 한도에 도달했습니다.\n{{itemName}}[[를]] 대신 받습니다.", "eggHatching": "어라…?", "eggSkipPrompt": "알 부화 요약 화면으로 바로 넘어가시겠습니까?", "ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?", From 579975dfc9267a91c7d3c1834af81575aaff9661 Mon Sep 17 00:00:00 2001 From: returntoice <171243264+returntoice@users.noreply.github.com> Date: Thu, 26 Sep 2024 04:59:37 +0900 Subject: [PATCH 13/18] [Localization] minor ko fix (#4433) Co-authored-by: Enoch --- src/locales/ko/modifier-type.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/locales/ko/modifier-type.json b/src/locales/ko/modifier-type.json index f04dff7b1af..f9d8fd1a861 100644 --- a/src/locales/ko/modifier-type.json +++ b/src/locales/ko/modifier-type.json @@ -50,9 +50,9 @@ "description": "{{battleCount}}번의 배틀 동안 더블 배틀이 등장할 확률이 4배가 된다." }, "TempStatStageBoosterModifierType": { - "description": "자신의 모든 포켓몬이 5번의 배틀 동안 {{stat}}[[가]] {{amount}}단계 증가한다.", + "description": "자신의 모든 포켓몬이 5번의 배틀 동안 {{stat}}[[가]] {{amount}} 증가한다.", "extra": { - "stage": "1 스테이지", + "stage": "1단계", "percentage": "30%" } }, From 320aefd1a3e33cf464c9d6c27d1c51d892fe9746 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 21:33:18 +0000 Subject: [PATCH 14/18] Bump rollup from 4.18.1 to 4.22.4 Bumps [rollup](https://github.com/rollup/rollup) from 4.18.1 to 4.22.4. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v4.18.1...v4.22.4) --- updated-dependencies: - dependency-name: rollup dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 150 +++++++++++++++++++++------------------------- 1 file changed, 67 insertions(+), 83 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0605b299dab..68c12156bbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1234,224 +1234,208 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", - "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", - "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", - "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", - "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", - "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", - "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", - "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", - "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", - "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", - "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", - "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", - "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", - "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", - "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", - "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", - "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -4866,9 +4850,9 @@ } }, "node_modules/rollup": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", - "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -4881,22 +4865,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.1", - "@rollup/rollup-android-arm64": "4.18.1", - "@rollup/rollup-darwin-arm64": "4.18.1", - "@rollup/rollup-darwin-x64": "4.18.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", - "@rollup/rollup-linux-arm-musleabihf": "4.18.1", - "@rollup/rollup-linux-arm64-gnu": "4.18.1", - "@rollup/rollup-linux-arm64-musl": "4.18.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", - "@rollup/rollup-linux-riscv64-gnu": "4.18.1", - "@rollup/rollup-linux-s390x-gnu": "4.18.1", - "@rollup/rollup-linux-x64-gnu": "4.18.1", - "@rollup/rollup-linux-x64-musl": "4.18.1", - "@rollup/rollup-win32-arm64-msvc": "4.18.1", - "@rollup/rollup-win32-ia32-msvc": "4.18.1", - "@rollup/rollup-win32-x64-msvc": "4.18.1", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, From eab610ca2280ec4aeaa481fff433c766f1bd7da7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 22:52:31 +0100 Subject: [PATCH 15/18] Bump rollup from 4.18.1 to 4.22.4 (#4429) * Undo egg skip event * Readded vouchers to original weights * [Bug] Fix Dire Hit & System Data Conversion Failure (#4282) Co-authored-by: xsn34kzx * Bump rollup from 4.18.1 to 4.22.4 Bumps [rollup](https://github.com/rollup/rollup) from 4.18.1 to 4.22.4. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v4.18.1...v4.22.4) --- updated-dependencies: - dependency-name: rollup dependency-type: indirect ... Signed-off-by: dependabot[bot] --------- Signed-off-by: dependabot[bot] Co-authored-by: Frederico Santos Co-authored-by: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> Co-authored-by: xsn34kzx Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- package-lock.json | 150 ++++++++++++++------------------ src/system/version-converter.ts | 40 ++++++--- 2 files changed, 93 insertions(+), 97 deletions(-) diff --git a/package-lock.json b/package-lock.json index 344100e4f6e..00942ee3312 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1511,224 +1511,208 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", - "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", - "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", - "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", - "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", - "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", - "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", - "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", - "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", - "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", - "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", - "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", - "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", - "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", - "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", - "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", - "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -5446,9 +5430,9 @@ } }, "node_modules/rollup": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", - "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -5461,22 +5445,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.1", - "@rollup/rollup-android-arm64": "4.18.1", - "@rollup/rollup-darwin-arm64": "4.18.1", - "@rollup/rollup-darwin-x64": "4.18.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", - "@rollup/rollup-linux-arm-musleabihf": "4.18.1", - "@rollup/rollup-linux-arm64-gnu": "4.18.1", - "@rollup/rollup-linux-arm64-musl": "4.18.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", - "@rollup/rollup-linux-riscv64-gnu": "4.18.1", - "@rollup/rollup-linux-s390x-gnu": "4.18.1", - "@rollup/rollup-linux-x64-gnu": "4.18.1", - "@rollup/rollup-linux-x64-musl": "4.18.1", - "@rollup/rollup-win32-arm64-msvc": "4.18.1", - "@rollup/rollup-win32-ia32-msvc": "4.18.1", - "@rollup/rollup-win32-x64-msvc": "4.18.1", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, diff --git a/src/system/version-converter.ts b/src/system/version-converter.ts index c297782ba66..0591647aeaa 100644 --- a/src/system/version-converter.ts +++ b/src/system/version-converter.ts @@ -22,15 +22,25 @@ export function applySessionDataPatches(data: SessionSaveData) { } else if (m.className === "PokemonResetNegativeStatStageModifier") { m.className = "ResetNegativeStatStageModifier"; } else if (m.className === "TempBattleStatBoosterModifier") { - m.className = "TempStatStageBoosterModifier"; - m.typeId = "TEMP_STAT_STAGE_BOOSTER"; + // Dire Hit no longer a part of the TempBattleStatBoosterModifierTypeGenerator + if (m.typeId !== "DIRE_HIT") { + m.className = "TempStatStageBoosterModifier"; + m.typeId = "TEMP_STAT_STAGE_BOOSTER"; - // Migration from TempBattleStat to Stat - const newStat = m.typePregenArgs[0] + 1; - m.typePregenArgs[0] = newStat; + // Migration from TempBattleStat to Stat + const newStat = m.typePregenArgs[0] + 1; + m.typePregenArgs[0] = newStat; + + // From [ stat, battlesLeft ] to [ stat, maxBattles, battleCount ] + m.args = [ newStat, 5, m.args[1] ]; + } else { + m.className = "TempCritBoosterModifier"; + m.typePregenArgs = []; + + // From [ stat, battlesLeft ] to [ maxBattles, battleCount ] + m.args = [ 5, m.args[1] ]; + } - // From [ stat, battlesLeft ] to [ stat, maxBattles, battleCount ] - m.args = [ newStat, 5, m.args[1] ]; } else if (m.className === "DoubleBattleChanceBoosterModifier" && m.args.length === 1) { let maxBattles: number; switch (m.typeId) { @@ -73,7 +83,7 @@ export function applySystemDataPatches(data: SystemSaveData) { case "1.0.3": case "1.0.4": // --- LEGACY PATCHES --- - if (data.starterData) { + if (data.starterData && data.dexData) { // Migrate ability starter data if empty for caught species Object.keys(data.starterData).forEach(sd => { if (data.dexData[sd]?.caughtAttr && (data.starterData[sd] && !data.starterData[sd].abilityAttr)) { @@ -104,12 +114,14 @@ export function applySystemDataPatches(data: SystemSaveData) { // --- PATCHES --- // Fix Starter Data - for (const starterId of defaultStarterSpecies) { - if (data.starterData[starterId]?.abilityAttr) { - data.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; - } - if (data.dexData[starterId]?.caughtAttr) { - data.dexData[starterId].caughtAttr |= DexAttr.FEMALE; + if (data.starterData && data.dexData) { + for (const starterId of defaultStarterSpecies) { + if (data.starterData[starterId]?.abilityAttr) { + data.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; + } + if (data.dexData[starterId]?.caughtAttr) { + data.dexData[starterId].caughtAttr |= DexAttr.FEMALE; + } } } } From 57f39efdae0d8288591320a97072a93190cd5890 Mon Sep 17 00:00:00 2001 From: Mumble <171087428+frutescens@users.noreply.github.com> Date: Wed, 25 Sep 2024 14:52:48 -0700 Subject: [PATCH 16/18] [Moves][Ability] Implement Torment / Taunt / Imprison + Aroma Veil (#4378) * Torment * Taunt and Imprison * ability immunities * Aroma Veil * Imprison * Test Files * Added exceptions for Rollout and check for active ability * adding tests so that git doesn't auto-fail * Blah * please * some documentation * Removed random newlines * Added check for ability's presence mid battle * Changed BattlerTagImmunityAbAttr to look at lists instead * Work? * Imprison and Taunt Tests * Tests * Final tests before documentation * documentation blah * Imports * Flx Change * flx - adding overrides * Update src/data/arena-tag.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * flx fixes * quick docs * privated retrieveField * Handling undefined * Update src/data/arena-tag.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * forget to remove partials for heal block * Apply suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Marked Torment as partial * Update src/test/moves/torment.test.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * tsdocs * Prevents test pokemon from being immune to torment * Update src/data/arena-tag.ts Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com> * Torranx Fixes * Check for this.source * why * lighting things with my mind on fire * aRHGHSHDKSHD --------- Co-authored-by: frutescens Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com> --- src/data/ability.ts | 18 ++- src/data/arena-tag.ts | 94 ++++++++++++++-- src/data/battler-tags.ts | 152 +++++++++++++++++++++++++- src/data/move.ts | 9 +- src/enums/arena-tag-type.ts | 3 +- src/enums/battler-tag-type.ts | 3 + src/locales/en/battler-tags.json | 3 + src/test/abilities/aroma_veil.test.ts | 65 +++++++++++ src/test/moves/imprison.test.ts | 98 +++++++++++++++++ src/test/moves/taunt.test.ts | 54 +++++++++ src/test/moves/torment.test.ts | 64 +++++++++++ 11 files changed, 537 insertions(+), 26 deletions(-) create mode 100644 src/test/abilities/aroma_veil.test.ts create mode 100644 src/test/moves/imprison.test.ts create mode 100644 src/test/moves/taunt.test.ts create mode 100644 src/test/moves/torment.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index 9e9c423623d..3ace872de3c 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2026,6 +2026,7 @@ export class PostSummonAbAttr extends AbAttr { return false; } } + /** * Removes specified arena tags when a Pokemon is summoned. */ @@ -2852,17 +2853,17 @@ export class PreApplyBattlerTagAbAttr extends AbAttr { * Provides immunity to BattlerTags {@linkcode BattlerTag} to specified targets. */ export class PreApplyBattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { - private immuneTagType: BattlerTagType; + private immuneTagTypes: BattlerTagType[]; private battlerTag: BattlerTag; - constructor(immuneTagType: BattlerTagType) { + constructor(immuneTagTypes: BattlerTagType | BattlerTagType[]) { super(); - this.immuneTagType = immuneTagType; + this.immuneTagTypes = Array.isArray(immuneTagTypes) ? immuneTagTypes : [immuneTagTypes]; } applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (tag.tagType === this.immuneTagType) { + if (this.immuneTagTypes.includes(tag.tagType)) { cancelled.value = true; if (!simulated) { this.battlerTag = tag; @@ -4916,7 +4917,7 @@ export function initAbilities() { .attr(TypeImmunityHealAbAttr, Type.WATER) .ignorable(), new Ability(Abilities.OBLIVIOUS, 3) - .attr(BattlerTagImmunityAbAttr, BattlerTagType.INFATUATED) + .attr(BattlerTagImmunityAbAttr, [BattlerTagType.INFATUATED, BattlerTagType.TAUNT]) .attr(IntimidateImmunityAbAttr) .ignorable(), new Ability(Abilities.CLOUD_NINE, 3) @@ -5402,8 +5403,7 @@ export function initAbilities() { .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTeravolt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.AROMA_VEIL, 6) - .ignorable() - .unimplemented(), + .attr(UserFieldBattlerTagImmunityAbAttr, [BattlerTagType.INFATUATED, BattlerTagType.TAUNT, BattlerTagType.DISABLED, BattlerTagType.TORMENT, BattlerTagType.HEAL_BLOCK]), new Ability(Abilities.FLOWER_VEIL, 6) .ignorable() .unimplemented(), @@ -5885,7 +5885,6 @@ export function initAbilities() { .ignorable(), new Ability(Abilities.EARTH_EATER, 9) .attr(TypeImmunityHealAbAttr, Type.GROUND) - .partial() // Healing not blocked by Heal Block .ignorable(), new Ability(Abilities.MYCELIUM_MIGHT, 9) .attr(ChangeMovePriorityAbAttr, (pokemon, move) => move.category === MoveCategory.STATUS, -0.2) @@ -5900,8 +5899,7 @@ export function initAbilities() { .attr(PostSummonStatStageChangeAbAttr, [ Stat.EVA ], -1) .condition(getOncePerBattleCondition(Abilities.SUPERSWEET_SYRUP)), new Ability(Abilities.HOSPITALITY, 9) - .attr(PostSummonAllyHealAbAttr, 4, true) - .partial(), // Healing not blocked by Heal Block + .attr(PostSummonAllyHealAbAttr, 4, true), new Ability(Abilities.TOXIC_CHAIN, 9) .attr(PostAttackApplyStatusEffectAbAttr, false, 30, StatusEffect.TOXIC), new Ability(Abilities.EMBODY_ASPECT_TEAL, 9) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index fdc32b75c19..8ffb3038629 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1,14 +1,15 @@ -import { Arena } from "../field/arena"; -import { Type } from "./type"; -import * as Utils from "../utils"; -import { MoveCategory, allMoves, MoveTarget, IncrementMovePriorityAttr, applyMoveAttrs } from "./move"; -import { getPokemonNameWithAffix } from "../messages"; -import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; -import { StatusEffect } from "./status-effect"; -import { BattlerIndex } from "../battle"; -import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability"; +import { Arena } from "#app/field/arena"; +import BattleScene from "#app/battle-scene"; +import { Type } from "#app/data/type"; +import * as Utils from "#app/utils"; +import { MoveCategory, allMoves, MoveTarget, IncrementMovePriorityAttr, applyMoveAttrs } from "#app/data/move"; +import { getPokemonNameWithAffix } from "#app/messages"; +import Pokemon, { HitResult, PlayerPokemon, PokemonMove, EnemyPokemon } from "#app/field/pokemon"; +import { StatusEffect } from "#app/data/status-effect"; +import { BattlerIndex } from "#app/battle"; +import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, ProtectStatAbAttr, applyAbAttrs } from "#app/data/ability"; import { Stat } from "#enums/stat"; -import { CommonAnim, CommonBattleAnim } from "./battle-anims"; +import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; import i18next from "i18next"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; @@ -919,6 +920,77 @@ class SafeguardTag extends ArenaTag { } } +/** + * This arena tag facilitates the application of the move Imprison + * Imprison remains in effect as long as the source Pokemon is active and present on the field. + * Imprison will apply to any opposing Pokemon that switch onto the field as well. + */ +class ImprisonTag extends ArenaTrapTag { + private source: Pokemon; + + constructor(sourceId: number, side: ArenaTagSide) { + super(ArenaTagType.IMPRISON, Moves.IMPRISON, sourceId, side, 1); + } + + /** + * Helper function that retrieves the Pokemon effected + * @param {BattleScene} scene medium to retrieve the involved Pokemon + * @returns list of PlayerPokemon or EnemyPokemon on the field + */ + private retrieveField(scene: BattleScene): PlayerPokemon[] | EnemyPokemon[] { + if (!this.source.isPlayer()) { + return scene.getPlayerField() ?? []; + } + return scene.getEnemyField() ?? []; + } + + /** + * This function applies the effects of Imprison to the opposing Pokemon already present on the field. + * @param arena + */ + override onAdd({ scene }: Arena) { + this.source = scene.getPokemonById(this.sourceId!)!; + if (this.source) { + const party = this.retrieveField(scene); + party?.forEach((p: PlayerPokemon | EnemyPokemon ) => { + p.addTag(BattlerTagType.IMPRISON, 1, Moves.IMPRISON, this.sourceId); + }); + scene.queueMessage(i18next.t("battlerTags:imprisonOnAdd", {pokemonNameWithAffix: getPokemonNameWithAffix(this.source)})); + } + } + + /** + * Checks if the source Pokemon is still active on the field + * @param _arena + * @returns `true` if the source of the tag is still active on the field | `false` if not + */ + override lapse(_arena: Arena): boolean { + return this.source.isActive(true); + } + + /** + * This applies the effects of Imprison to any opposing Pokemon that switch into the field while the source Pokemon is still active + * @param {Pokemon} pokemon the Pokemon Imprison is applied to + * @returns `true` + */ + override activateTrap(pokemon: Pokemon): boolean { + if (this.source.isActive(true)) { + pokemon.addTag(BattlerTagType.IMPRISON, 1, Moves.IMPRISON, this.sourceId); + } + return true; + } + + /** + * When the arena tag is removed, it also attempts to remove any related Battler Tags if they haven't already been removed from the affected Pokemon + * @param arena + */ + override onRemove({ scene }: Arena): void { + const party = this.retrieveField(scene); + party?.forEach((p: PlayerPokemon | EnemyPokemon) => { + p.removeTag(BattlerTagType.IMPRISON); + }); + } +} export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null { switch (tagType) { @@ -967,6 +1039,8 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov return new HappyHourTag(turnCount, sourceId, side); case ArenaTagType.SAFEGUARD: return new SafeguardTag(turnCount, sourceId, side); + case ArenaTagType.IMPRISON: + return new ImprisonTag(sourceId, side); default: return null; } diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index e92446ef5a2..65af0fb6ee8 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -3,7 +3,7 @@ import { getPokemonNameWithAffix } from "../messages"; import Pokemon, { MoveResult, HitResult } from "../field/pokemon"; import { StatusEffect } from "./status-effect"; import * as Utils from "../utils"; -import { ChargeAttr, MoveFlags, allMoves, MoveCategory, applyMoveAttrs, StatusCategoryOnAllyAttr, HealOnAllyAttr } from "./move"; +import { ChargeAttr, MoveFlags, allMoves, MoveCategory, applyMoveAttrs, StatusCategoryOnAllyAttr, HealOnAllyAttr, ConsecutiveUseDoublePowerAttr } from "./move"; import { Type } from "./type"; import { BlockNonDirectDamageAbAttr, FlinchEffectAbAttr, ReverseDrainAbAttr, applyAbAttrs, ProtectStatAbAttr } from "./ability"; import { TerrainType } from "./terrain"; @@ -2437,6 +2437,150 @@ export class MysteryEncounterPostSummonTag extends BattlerTag { } } +/** + * Battle Tag that applies the move Torment to the target Pokemon + * Torment restricts the use of moves twice in a row. + * The tag is only removed if the target leaves the battle. + * Torment does not interrupt the move if the move is performed consecutively in the same turn and right after Torment is applied + */ +export class TormentTag extends MoveRestrictionBattlerTag { + private target: Pokemon; + + constructor(sourceId: number) { + super(BattlerTagType.TORMENT, BattlerTagLapseType.AFTER_MOVE, 1, Moves.TORMENT, sourceId); + } + + /** + * Adds the battler tag to the target Pokemon and defines the private class variable 'target' + * 'Target' is used to track the Pokemon's current status + * @param {Pokemon} pokemon the Pokemon tormented + */ + override onAdd(pokemon: Pokemon) { + super.onAdd(pokemon); + this.target = pokemon; + pokemon.scene.queueMessage(i18next.t("battlerTags:tormentOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + } + + /** + * Torment only ends when the affected Pokemon leaves the battle field + * @param {Pokemon} pokemon the Pokemon under the effects of Torment + * @param _tagType + * @returns `true` if still present | `false` if not + */ + override lapse(pokemon: Pokemon, _tagType: BattlerTagLapseType): boolean { + return !pokemon.isActive(true); + } + + /** + * This checks if the current move used is identical to the last used move with a {@linkcode MoveResult} of `SUCCESS`/`MISS` + * @param {Moves} move the move under investigation + * @returns `true` if there is valid consecutive usage | `false` if the moves are different from each other + */ + override isMoveRestricted(move: Moves): boolean { + const lastMove = this.target.getLastXMoves(1)[0]; + if ( !lastMove ) { + return false; + } + // This checks for locking / momentum moves like Rollout and Hydro Cannon + if the user is under the influence of BattlerTagType.FRENZY + // Because Uproar's unique behavior is not implemented, it does not check for Uproar. Torment has been marked as partial in moves.ts + const moveObj = allMoves[lastMove.move]; + const isUnaffected = moveObj.hasAttr(ConsecutiveUseDoublePowerAttr) || this.target.getTag(BattlerTagType.FRENZY) || moveObj.hasAttr(ChargeAttr); + const validLastMoveResult = (lastMove.result === MoveResult.SUCCESS) || (lastMove.result === MoveResult.MISS); + if (lastMove.move === move && validLastMoveResult && lastMove.move !== Moves.STRUGGLE && !isUnaffected) { + return true; + } + return false; + } + + override selectionDeniedText(_pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:moveCannotBeSelected", { moveName: allMoves[move].name }); + } +} + +/** + * BattlerTag that applies the effects of Taunt to the target Pokemon + * Taunt restricts the use of status moves. + * The tag is removed after 4 turns. + */ +export class TauntTag extends MoveRestrictionBattlerTag { + constructor() { + super(BattlerTagType.TAUNT, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE], 4, Moves.TAUNT); + } + + override onAdd(pokemon: Pokemon) { + super.onAdd(pokemon); + pokemon.scene.queueMessage(i18next.t("battlerTags:tauntOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + } + + /** + * Checks if a move is a status move and determines its restriction status on that basis + * @param {Moves} move the move under investigation + * @returns `true` if the move is a status move + */ + override isMoveRestricted(move: Moves): boolean { + return allMoves[move].category === MoveCategory.STATUS; + } + + override selectionDeniedText(_pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:moveCannotBeSelected", { moveName: allMoves[move].name }); + } + + override interruptedText(pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:disableInterruptedMove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + } +} + +/** + * BattlerTag that applies the effects of Imprison to the target Pokemon + * Imprison restricts the opposing side's usage of moves shared by the source-user of Imprison. + * The tag is only removed when the source-user is removed from the field. + */ +export class ImprisonTag extends MoveRestrictionBattlerTag { + private source: Pokemon | null; + + constructor(sourceId: number) { + super(BattlerTagType.IMPRISON, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE], 1, Moves.IMPRISON, sourceId); + } + + override onAdd(pokemon: Pokemon) { + if (this.sourceId) { + this.source = pokemon.scene.getPokemonById(this.sourceId); + } + } + + /** + * Checks if the source of Imprison is still active + * @param _pokemon + * @param _lapseType + * @returns `true` if the source is still active + */ + override lapse(_pokemon: Pokemon, _lapseType: BattlerTagLapseType): boolean { + return this.source?.isActive(true) ?? false; + } + + /** + * Checks if the source of the tag has the parameter move in its moveset and that the source is still active + * @param {Moves} move the move under investigation + * @returns `false` if either condition is not met + */ + override isMoveRestricted(move: Moves): boolean { + if (this.source) { + const sourceMoveset = this.source.getMoveset().map(m => m!.moveId); + return sourceMoveset?.includes(move) && this.source.isActive(true); + } + return false; + } + + override selectionDeniedText(_pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:moveCannotBeSelected", { moveName: allMoves[move].name }); + } + + override interruptedText(pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:disableInterruptedMove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + } +} + + /** * Retrieves a {@linkcode BattlerTag} based on the provided tag type, turn count, source move, and source ID. * @@ -2604,6 +2748,12 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source return new MysteryEncounterPostSummonTag(); case BattlerTagType.HEAL_BLOCK: return new HealBlockTag(turnCount, sourceMove); + case BattlerTagType.TORMENT: + return new TormentTag(sourceId); + case BattlerTagType.TAUNT: + return new TauntTag(); + case BattlerTagType.IMPRISON: + return new ImprisonTag(sourceId); case BattlerTagType.NONE: default: return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); diff --git a/src/data/move.ts b/src/data/move.ts index 8866e86f708..27c27696650 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -7507,7 +7507,8 @@ export function initMoves() { .target(MoveTarget.BOTH_SIDES), new StatusMove(Moves.TORMENT, Type.DARK, 100, 15, -1, 0, 3) .ignoresSubstitute() - .unimplemented(), + .partial() // Incomplete implementation because of Uproar's partial implementation + .attr(AddBattlerTagAttr, BattlerTagType.TORMENT, false, true, 1), new StatusMove(Moves.FLATTER, Type.DARK, 100, 15, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1) .attr(ConfuseAttr), @@ -7538,7 +7539,7 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.CHARGED, true, false), new StatusMove(Moves.TAUNT, Type.DARK, 100, 20, -1, 0, 3) .ignoresSubstitute() - .unimplemented(), + .attr(AddBattlerTagAttr, BattlerTagType.TAUNT, false, true, 4), new StatusMove(Moves.HELPING_HAND, Type.NORMAL, -1, 20, -1, 5, 3) .attr(AddBattlerTagAttr, BattlerTagType.HELPING_HAND) .ignoresSubstitute() @@ -7581,9 +7582,9 @@ export function initMoves() { new StatusMove(Moves.SKILL_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 3) .ignoresSubstitute() .attr(SwitchAbilitiesAttr), - new SelfStatusMove(Moves.IMPRISON, Type.PSYCHIC, -1, 10, -1, 0, 3) + new StatusMove(Moves.IMPRISON, Type.PSYCHIC, 100, 10, -1, 0, 3) .ignoresSubstitute() - .unimplemented(), + .attr(AddArenaTagAttr, ArenaTagType.IMPRISON, 1, true, false), new SelfStatusMove(Moves.REFRESH, Type.NORMAL, -1, 20, -1, 0, 3) .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN) .condition((user, target, move) => !!user.status && (user.status.effect === StatusEffect.PARALYSIS || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.BURN)), diff --git a/src/enums/arena-tag-type.ts b/src/enums/arena-tag-type.ts index 1c79750c91a..c6f911cb493 100644 --- a/src/enums/arena-tag-type.ts +++ b/src/enums/arena-tag-type.ts @@ -23,5 +23,6 @@ export enum ArenaTagType { TAILWIND = "TAILWIND", HAPPY_HOUR = "HAPPY_HOUR", SAFEGUARD = "SAFEGUARD", - NO_CRIT = "NO_CRIT" + NO_CRIT = "NO_CRIT", + IMPRISON = "IMPRISON", } diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index d606ae319f7..9ed3b629746 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -82,4 +82,7 @@ export enum BattlerTagType { AUTOTOMIZED = "AUTOTOMIZED", MYSTERY_ENCOUNTER_POST_SUMMON = "MYSTERY_ENCOUNTER_POST_SUMMON", HEAL_BLOCK = "HEAL_BLOCK", + TORMENT = "TORMENT", + TAUNT = "TAUNT", + IMPRISON = "IMPRISON", } diff --git a/src/locales/en/battler-tags.json b/src/locales/en/battler-tags.json index 481f69db250..6a5eeee2577 100644 --- a/src/locales/en/battler-tags.json +++ b/src/locales/en/battler-tags.json @@ -74,5 +74,8 @@ "substituteOnAdd": "{{pokemonNameWithAffix}} put in a substitute!", "substituteOnHit": "The substitute took damage for {{pokemonNameWithAffix}}!", "substituteOnRemove": "{{pokemonNameWithAffix}}'s substitute faded!", + "tormentOnAdd": "{{pokemonNameWithAffix}} was subjected to torment!", + "tauntOnAdd": "{{pokemonNameWithAffix}} fell for the taunt!", + "imprisonOnAdd": "{{pokemonNameWithAffix}} sealed the opponents move(s)!", "autotomizeOnAdd": "{{pokemonNameWithAffix}} became nimble!" } diff --git a/src/test/abilities/aroma_veil.test.ts b/src/test/abilities/aroma_veil.test.ts new file mode 100644 index 00000000000..b70308a5d60 --- /dev/null +++ b/src/test/abilities/aroma_veil.test.ts @@ -0,0 +1,65 @@ +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { BattlerIndex } from "#app/battle"; +import { PlayerPokemon } from "#app/field/pokemon"; + +describe("Moves - Aroma Veil", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("double") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.HEAL_BLOCK, Moves.IMPRISON, Moves.SPLASH]) + .enemySpecies(Species.SHUCKLE) + .ability(Abilities.AROMA_VEIL) + .moveset([Moves.GROWL]); + }); + + it("Aroma Veil protects the Pokemon's side against most Move Restriction Battler Tags", async () => { + await game.classicMode.startBattle([Species.REGIELEKI, Species.BULBASAUR]); + + const party = game.scene.getParty()! as PlayerPokemon[]; + + game.move.select(Moves.GROWL); + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.HEAL_BLOCK); + await game.toNextTurn(); + party.forEach(p => { + expect(p.getTag(BattlerTagType.HEAL_BLOCK)).toBeUndefined(); + }); + }); + + it("Aroma Veil does not protect against Imprison", async () => { + await game.classicMode.startBattle([Species.REGIELEKI, Species.BULBASAUR]); + + const party = game.scene.getParty()! as PlayerPokemon[]; + + game.move.select(Moves.GROWL); + game.move.select(Moves.GROWL, 1); + await game.forceEnemyMove(Moves.IMPRISON, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + expect(game.scene.arena.getTag(ArenaTagType.IMPRISON)).toBeDefined(); + party.forEach(p => { + expect(p.getTag(BattlerTagType.IMPRISON)).toBeDefined(); + }); + }); +}); diff --git a/src/test/moves/imprison.test.ts b/src/test/moves/imprison.test.ts new file mode 100644 index 00000000000..abb4b3cac6c --- /dev/null +++ b/src/test/moves/imprison.test.ts @@ -0,0 +1,98 @@ +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { ArenaTagType } from "#enums/arena-tag-type"; + +describe("Moves - Imprison", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.IMPRISON, Moves.SPLASH, Moves.GROWL]) + .enemySpecies(Species.SHUCKLE) + .moveset([Moves.TRANSFORM, Moves.SPLASH]); + }); + + it("Pokemon under Imprison cannot use shared moves", async () => { + await game.classicMode.startBattle([Species.REGIELEKI]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.TRANSFORM); + await game.forceEnemyMove(Moves.IMPRISON); + await game.toNextTurn(); + const playerMoveset = playerPokemon.getMoveset().map(x => x?.moveId); + const enemyMoveset = game.scene.getEnemyPokemon()!.getMoveset().map(x => x?.moveId); + expect(enemyMoveset.includes(playerMoveset[0])).toBeTruthy(); + const imprisonArenaTag = game.scene.arena.getTag(ArenaTagType.IMPRISON); + const imprisonBattlerTag = playerPokemon.getTag(BattlerTagType.IMPRISON); + expect(imprisonArenaTag).toBeDefined(); + expect(imprisonBattlerTag).toBeDefined(); + + // Second turn, Imprison forces Struggle to occur + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + const move1 = playerPokemon.getLastXMoves(1)[0]!; + expect(move1.move).toBe(Moves.STRUGGLE); + }); + + it("Imprison applies to Pokemon switched into Battle", async () => { + await game.classicMode.startBattle([Species.REGIELEKI, Species.BULBASAUR]); + + const playerPokemon1 = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.IMPRISON); + await game.toNextTurn(); + const imprisonArenaTag = game.scene.arena.getTag(ArenaTagType.IMPRISON); + const imprisonBattlerTag1 = playerPokemon1.getTag(BattlerTagType.IMPRISON); + expect(imprisonArenaTag).toBeDefined(); + expect(imprisonBattlerTag1).toBeDefined(); + + // Second turn, Imprison forces Struggle to occur + game.doSwitchPokemon(1); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + const playerPokemon2 = game.scene.getPlayerPokemon()!; + const imprisonBattlerTag2 = playerPokemon2.getTag(BattlerTagType.IMPRISON); + expect(playerPokemon1).not.toEqual(playerPokemon2); + expect(imprisonBattlerTag2).toBeDefined(); + }); + + it("The effects of Imprison only end when the source is no longer active", async () => { + game.override.moveset([Moves.SPLASH, Moves.IMPRISON]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.BULBASAUR]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + game.move.select(Moves.IMPRISON); + await game.forceEnemyMove(Moves.GROWL); + await game.toNextTurn(); + expect(game.scene.arena.getTag(ArenaTagType.IMPRISON)).toBeDefined(); + expect(enemyPokemon.getTag(BattlerTagType.IMPRISON)).toBeDefined(); + game.doSwitchPokemon(1); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon.isActive(true)).toBeFalsy(); + expect(game.scene.arena.getTag(ArenaTagType.IMPRISON)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.IMPRISON)).toBeUndefined(); + }); +}); diff --git a/src/test/moves/taunt.test.ts b/src/test/moves/taunt.test.ts new file mode 100644 index 00000000000..50bb2fee9df --- /dev/null +++ b/src/test/moves/taunt.test.ts @@ -0,0 +1,54 @@ +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { MoveResult } from "#app/field/pokemon"; +import { BattlerTagType } from "#enums/battler-tag-type"; + +describe("Moves - Taunt", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.TAUNT, Moves.SPLASH]) + .enemySpecies(Species.SHUCKLE) + .moveset([Moves.GROWL]); + }); + + it("Pokemon should not be able to use Status Moves", async () => { + await game.classicMode.startBattle([Species.REGIELEKI]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + // First turn, Player Pokemon succeeds using Growl without Taunt + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.TAUNT); + await game.toNextTurn(); + const move1 = playerPokemon.getLastXMoves(1)[0]!; + expect(move1.move).toBe(Moves.GROWL); + expect(move1.result).toBe(MoveResult.SUCCESS); + expect(playerPokemon?.getTag(BattlerTagType.TAUNT)).toBeDefined(); + + // Second turn, Taunt forces Struggle to occur + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + const move2 = playerPokemon.getLastXMoves(1)[0]!; + expect(move2.move).toBe(Moves.STRUGGLE); + }); +}); diff --git a/src/test/moves/torment.test.ts b/src/test/moves/torment.test.ts new file mode 100644 index 00000000000..f725f2bc34a --- /dev/null +++ b/src/test/moves/torment.test.ts @@ -0,0 +1,64 @@ +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { MoveResult } from "#app/field/pokemon"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; + +describe("Moves - Torment", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.TORMENT, Moves.SPLASH]) + .enemySpecies(Species.SHUCKLE) + .enemyLevel(30) + .moveset([Moves.TACKLE]) + .ability(Abilities.BALL_FETCH); + }); + + it("Pokemon should not be able to use the same move consecutively", async () => { + await game.classicMode.startBattle([Species.CHANSEY]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + // First turn, Player Pokemon uses Tackle successfully + game.move.select(Moves.TACKLE); + await game.forceEnemyMove(Moves.TORMENT); + await game.toNextTurn(); + const move1 = playerPokemon.getLastXMoves(1)[0]!; + expect(move1.move).toBe(Moves.TACKLE); + expect(move1.result).toBe(MoveResult.SUCCESS); + expect(playerPokemon?.getTag(BattlerTagType.TORMENT)).toBeDefined(); + + // Second turn, Torment forces Struggle to occur + game.move.select(Moves.TACKLE); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + const move2 = playerPokemon.getLastXMoves(1)[0]!; + expect(move2.move).toBe(Moves.STRUGGLE); + + // Third turn, Tackle can be used. + game.move.select(Moves.TACKLE); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + const move3 = playerPokemon.getLastXMoves(1)[0]!; + expect(move3.move).toBe(Moves.TACKLE); + }); +}); From 05c84aaa8ac84d13f754a4e2b89ca8feeda45542 Mon Sep 17 00:00:00 2001 From: Frederico Santos Date: Wed, 25 Sep 2024 23:02:11 +0100 Subject: [PATCH 17/18] Revert "Bump rollup from 4.18.1 to 4.22.4 (#4429)" (#4437) This reverts commit eab610ca2280ec4aeaa481fff433c766f1bd7da7. --- package-lock.json | 150 ++++++++++++++++++-------------- src/system/version-converter.ts | 40 +++------ 2 files changed, 97 insertions(+), 93 deletions(-) diff --git a/package-lock.json b/package-lock.json index 00942ee3312..344100e4f6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1511,208 +1511,224 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", + "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", + "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", + "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", + "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", + "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", + "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", + "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", + "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", + "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", + "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", + "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", + "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", + "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", + "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", + "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", + "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -5430,9 +5446,9 @@ } }, "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", + "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -5445,22 +5461,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", + "@rollup/rollup-android-arm-eabi": "4.18.1", + "@rollup/rollup-android-arm64": "4.18.1", + "@rollup/rollup-darwin-arm64": "4.18.1", + "@rollup/rollup-darwin-x64": "4.18.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", + "@rollup/rollup-linux-arm-musleabihf": "4.18.1", + "@rollup/rollup-linux-arm64-gnu": "4.18.1", + "@rollup/rollup-linux-arm64-musl": "4.18.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", + "@rollup/rollup-linux-riscv64-gnu": "4.18.1", + "@rollup/rollup-linux-s390x-gnu": "4.18.1", + "@rollup/rollup-linux-x64-gnu": "4.18.1", + "@rollup/rollup-linux-x64-musl": "4.18.1", + "@rollup/rollup-win32-arm64-msvc": "4.18.1", + "@rollup/rollup-win32-ia32-msvc": "4.18.1", + "@rollup/rollup-win32-x64-msvc": "4.18.1", "fsevents": "~2.3.2" } }, diff --git a/src/system/version-converter.ts b/src/system/version-converter.ts index 0591647aeaa..c297782ba66 100644 --- a/src/system/version-converter.ts +++ b/src/system/version-converter.ts @@ -22,25 +22,15 @@ export function applySessionDataPatches(data: SessionSaveData) { } else if (m.className === "PokemonResetNegativeStatStageModifier") { m.className = "ResetNegativeStatStageModifier"; } else if (m.className === "TempBattleStatBoosterModifier") { - // Dire Hit no longer a part of the TempBattleStatBoosterModifierTypeGenerator - if (m.typeId !== "DIRE_HIT") { - m.className = "TempStatStageBoosterModifier"; - m.typeId = "TEMP_STAT_STAGE_BOOSTER"; + m.className = "TempStatStageBoosterModifier"; + m.typeId = "TEMP_STAT_STAGE_BOOSTER"; - // Migration from TempBattleStat to Stat - const newStat = m.typePregenArgs[0] + 1; - m.typePregenArgs[0] = newStat; - - // From [ stat, battlesLeft ] to [ stat, maxBattles, battleCount ] - m.args = [ newStat, 5, m.args[1] ]; - } else { - m.className = "TempCritBoosterModifier"; - m.typePregenArgs = []; - - // From [ stat, battlesLeft ] to [ maxBattles, battleCount ] - m.args = [ 5, m.args[1] ]; - } + // Migration from TempBattleStat to Stat + const newStat = m.typePregenArgs[0] + 1; + m.typePregenArgs[0] = newStat; + // From [ stat, battlesLeft ] to [ stat, maxBattles, battleCount ] + m.args = [ newStat, 5, m.args[1] ]; } else if (m.className === "DoubleBattleChanceBoosterModifier" && m.args.length === 1) { let maxBattles: number; switch (m.typeId) { @@ -83,7 +73,7 @@ export function applySystemDataPatches(data: SystemSaveData) { case "1.0.3": case "1.0.4": // --- LEGACY PATCHES --- - if (data.starterData && data.dexData) { + if (data.starterData) { // Migrate ability starter data if empty for caught species Object.keys(data.starterData).forEach(sd => { if (data.dexData[sd]?.caughtAttr && (data.starterData[sd] && !data.starterData[sd].abilityAttr)) { @@ -114,14 +104,12 @@ export function applySystemDataPatches(data: SystemSaveData) { // --- PATCHES --- // Fix Starter Data - if (data.starterData && data.dexData) { - for (const starterId of defaultStarterSpecies) { - if (data.starterData[starterId]?.abilityAttr) { - data.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; - } - if (data.dexData[starterId]?.caughtAttr) { - data.dexData[starterId].caughtAttr |= DexAttr.FEMALE; - } + for (const starterId of defaultStarterSpecies) { + if (data.starterData[starterId]?.abilityAttr) { + data.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; + } + if (data.dexData[starterId]?.caughtAttr) { + data.dexData[starterId].caughtAttr |= DexAttr.FEMALE; } } } From a6a61b2984f6992b6e7ff0bf282898374fc5e4c6 Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:17:46 -0700 Subject: [PATCH 18/18] [Move] Implement Shed Tail (#4382) * Implement Shed Tail * Fix leftover batonPass reference in docs * Fix ChillyReceptionAttr * oops * Remove unneeded default arg in ReturnPhase * Fix imports per Kev's suggestions Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Docs and Shed Tail on-add message * Remove mixin attribute * Update battler-tags.json * Update battler-tags.json * Update battler-tags.json * Update battler-tags.json * Update battler-tags.json * Update battler-tags.json * Update battler-tags.json * Update battler-tags.json * Update battler-tags.json * Update battler-tags.json * Fix indents * More nit fixes * Make Switch[Summon]Phase params readonly --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Lugiad Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/data/battler-tags.ts | 11 +- src/data/move.ts | 140 ++++++++++++------------- src/enums/switch-type.ts | 12 +++ src/field/pokemon.ts | 16 +-- src/locales/de/battler-tags.json | 1 + src/locales/en/battler-tags.json | 1 + src/locales/es/battler-tags.json | 1 + src/locales/fr/battler-tags.json | 1 + src/locales/it/battler-tags.json | 1 + src/locales/ja/battler-tags.json | 3 +- src/locales/ko/battler-tags.json | 1 + src/locales/zh_CN/battler-tags.json | 1 + src/locales/zh_TW/battler-tags.json | 1 + src/phases/check-switch-phase.ts | 3 +- src/phases/faint-phase.ts | 5 +- src/phases/mystery-encounter-phases.ts | 3 +- src/phases/return-phase.ts | 3 +- src/phases/switch-phase.ts | 27 +++-- src/phases/switch-summon-phase.ts | 28 +++-- src/phases/turn-init-phase.ts | 2 +- src/phases/turn-start-phase.ts | 4 +- src/test/abilities/zen_mode.test.ts | 3 +- src/test/moves/shed_tail.test.ts | 56 ++++++++++ 23 files changed, 216 insertions(+), 108 deletions(-) create mode 100644 src/enums/switch-type.ts create mode 100644 src/test/moves/shed_tail.test.ts diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 65af0fb6ee8..579d068e882 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -2311,6 +2311,11 @@ export class AutotomizedTag extends BattlerTag { } } +/** + * Tag implementing the {@link https://bulbapedia.bulbagarden.net/wiki/Substitute_(doll)#Effect | Substitute Doll} effect, + * for use with the moves Substitute and Shed Tail. Pokemon with this tag deflect most forms of received attack damage + * onto the tag. This tag also grants immunity to most Status moves and several move effects. + */ export class SubstituteTag extends BattlerTag { /** The substitute's remaining HP. If HP is depleted, the Substitute fades. */ public hp: number; @@ -2330,7 +2335,11 @@ export class SubstituteTag extends BattlerTag { // Queue battle animation and message pokemon.scene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_ADD); - pokemon.scene.queueMessage(i18next.t("battlerTags:substituteOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + if (this.sourceMove === Moves.SHED_TAIL) { + pokemon.scene.queueMessage(i18next.t("battlerTags:shedTailOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + } else { + pokemon.scene.queueMessage(i18next.t("battlerTags:substituteOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + } // Remove any binding effects from the user pokemon.findAndRemoveTags(tag => tag instanceof DamagingTrapTag); diff --git a/src/data/move.ts b/src/data/move.ts index 27c27696650..71d97e4fb5c 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -37,6 +37,7 @@ import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; import { SpeciesFormChangeRevertWeatherFormTrigger } from "./pokemon-forms"; import { GameMode } from "#app/game-mode"; import { applyChallenges, ChallengeType } from "./challenge"; +import { SwitchType } from "#enums/switch-type"; export enum MoveCategory { PHYSICAL, @@ -1476,8 +1477,13 @@ export class HalfSacrificialAttr extends MoveEffectAttr { * @see {@linkcode apply} */ export class AddSubstituteAttr extends MoveEffectAttr { - constructor() { + /** The ratio of the user's max HP that is required to apply this effect */ + private hpCost: number; + + constructor(hpCost: number = 0.25) { super(true); + + this.hpCost = hpCost; } /** @@ -1493,8 +1499,7 @@ export class AddSubstituteAttr extends MoveEffectAttr { return false; } - const hpCost = Math.floor(user.getMaxHp() / 4); - user.damageAndUpdate(hpCost, HitResult.OTHER, false, true, true); + user.damageAndUpdate(Math.floor(user.getMaxHp() * this.hpCost), HitResult.OTHER, false, true, true); user.addTag(BattlerTagType.SUBSTITUTE, 0, move.id, user.id); return true; } @@ -1507,7 +1512,7 @@ export class AddSubstituteAttr extends MoveEffectAttr { } getCondition(): MoveConditionFunc { - return (user, target, move) => !user.getTag(SubstituteTag) && user.hp > Math.floor(user.getMaxHp() / 4) && user.getMaxHp() > 1; + return (user, target, move) => !user.getTag(SubstituteTag) && user.hp > Math.floor(user.getMaxHp() * this.hpCost) && user.getMaxHp() > 1; } getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { @@ -5151,9 +5156,9 @@ export class RevivalBlessingAttr extends MoveEffectAttr { if (user.scene.currentBattle.double && user.scene.getEnemyParty().length > 1) { const allyPokemon = user.getAlly(); if (slotIndex<=1) { - user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, pokemon.getFieldIndex(), slotIndex, false, false, false)); + user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, false)); } else if (allyPokemon.isFainted()) { - user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, allyPokemon.getFieldIndex(), slotIndex, false, false, false)); + user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, false)); } } resolve(true); @@ -5176,72 +5181,69 @@ export class RevivalBlessingAttr extends MoveEffectAttr { export class ForceSwitchOutAttr extends MoveEffectAttr { constructor( private selfSwitch: boolean = false, - private batonPass: boolean = false + private switchType: SwitchType = SwitchType.SWITCH ) { super(false, MoveEffectTrigger.POST_APPLY, false, true); } isBatonPass() { - return this.batonPass; + return this.switchType === SwitchType.BATON_PASS; } - // TODO: Why is this a Promise? - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + // Check if the move category is not STATUS or if the switch out condition is not met + if (!this.getSwitchOutCondition()(user, target, move)) { + return false; + } - if (!this.getSwitchOutCondition()(user, target, move)) { - return resolve(false); + /** + * Move the switch out logic inside the conditional block + * This ensures that the switch out only happens when the conditions are met + */ + const switchOutTarget = this.selfSwitch ? user : target; + if (switchOutTarget instanceof PlayerPokemon) { + switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH); + + if (switchOutTarget.hp > 0) { + user.scene.prependToPhase(new SwitchPhase(user.scene, this.switchType, switchOutTarget.getFieldIndex(), true, true), MoveEndPhase); + return true; + } + return false; + } else if (user.scene.currentBattle.battleType !== BattleType.WILD) { + // Switch out logic for trainer battles + switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH); + + if (switchOutTarget.hp > 0) { + // for opponent switching out + user.scene.prependToPhase(new SwitchSummonPhase(user.scene, this.switchType, switchOutTarget.getFieldIndex(), + (user.scene.currentBattle.trainer ? user.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot) : 0), + false, false), MoveEndPhase); + } + } else { + // Switch out logic for everything else (eg: WILD battles) + switchOutTarget.leaveField(false); + + if (switchOutTarget.hp) { + user.scene.queueMessage(i18next.t("moveTriggers:fled", {pokemonName: getPokemonNameWithAffix(switchOutTarget)}), null, true, 500); + + // in double battles redirect potential moves off fled pokemon + if (switchOutTarget.scene.currentBattle.double) { + const allyPokemon = switchOutTarget.getAlly(); + switchOutTarget.scene.redirectPokemonMoves(switchOutTarget, allyPokemon); + } } - // Move the switch out logic inside the conditional block - // This ensures that the switch out only happens when the conditions are met - const switchOutTarget = this.selfSwitch ? user : target; - if (switchOutTarget instanceof PlayerPokemon) { - switchOutTarget.leaveField(!this.batonPass); - - if (switchOutTarget.hp > 0) { - user.scene.prependToPhase(new SwitchPhase(user.scene, switchOutTarget.getFieldIndex(), true, true), MoveEndPhase); - resolve(true); - } else { - resolve(false); - } - return; - } else if (user.scene.currentBattle.battleType !== BattleType.WILD) { - // Switch out logic for trainer battles - switchOutTarget.leaveField(!this.batonPass); - - if (switchOutTarget.hp > 0) { - // for opponent switching out - user.scene.prependToPhase(new SwitchSummonPhase(user.scene, switchOutTarget.getFieldIndex(), - (user.scene.currentBattle.trainer ? user.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot) : 0), - false, this.batonPass, false), MoveEndPhase); - } - } else { - // Switch out logic for everything else (eg: WILD battles) - switchOutTarget.leaveField(false); + if (!switchOutTarget.getAlly()?.isActive(true)) { + user.scene.clearEnemyHeldItemModifiers(); if (switchOutTarget.hp) { - user.scene.queueMessage(i18next.t("moveTriggers:fled", {pokemonName: getPokemonNameWithAffix(switchOutTarget)}), null, true, 500); - - // in double battles redirect potential moves off fled pokemon - if (switchOutTarget.scene.currentBattle.double) { - const allyPokemon = switchOutTarget.getAlly(); - switchOutTarget.scene.redirectPokemonMoves(switchOutTarget, allyPokemon); - } - } - - if (!switchOutTarget.getAlly()?.isActive(true)) { - user.scene.clearEnemyHeldItemModifiers(); - - if (switchOutTarget.hp) { - user.scene.pushPhase(new BattleEndPhase(user.scene)); - user.scene.pushPhase(new NewBattlePhase(user.scene)); - } + user.scene.pushPhase(new BattleEndPhase(user.scene)); + user.scene.pushPhase(new NewBattlePhase(user.scene)); } } + } - resolve(true); - }); + return true; } getCondition(): MoveConditionFunc { @@ -5270,7 +5272,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { } if (!player && user.scene.currentBattle.battleType === BattleType.WILD) { - if (this.batonPass) { + if (this.isBatonPass()) { return false; } // Don't allow wild opponents to flee on the boss stage since it can ruin a run early on @@ -5291,7 +5293,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { return -20; } let ret = this.selfSwitch ? Math.floor((1 - user.getHpRatio()) * 20) : super.getUserBenefitScore(user, target, move); - if (this.selfSwitch && this.batonPass) { + if (this.selfSwitch && this.isBatonPass()) { const statStageTotal = user.getStatStages().reduce((s: integer, total: integer) => total += s, 0); ret = ret / 2 + (Phaser.Tweens.Builders.GetEaseFunction("Sine.easeOut")(Math.min(Math.abs(statStageTotal), 10) / 10) * (statStageTotal >= 0 ? 10 : -10)); } @@ -5301,10 +5303,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { export class ChillyReceptionAttr extends ForceSwitchOutAttr { - - // using inherited constructor - - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { user.scene.arena.trySetWeather(WeatherType.SNOW, true); return super.apply(user, target, move, args); } @@ -7394,7 +7393,7 @@ export function initMoves() { new AttackMove(Moves.DRAGON_BREATH, Type.DRAGON, MoveCategory.SPECIAL, 60, 100, 20, 30, 0, 2) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new SelfStatusMove(Moves.BATON_PASS, Type.NORMAL, -1, 40, -1, 0, 2) - .attr(ForceSwitchOutAttr, true, true) + .attr(ForceSwitchOutAttr, true, SwitchType.BATON_PASS) .hidesUser(), new StatusMove(Moves.ENCORE, Type.NORMAL, 100, 5, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.ENCORE, false, true) @@ -7820,7 +7819,7 @@ export function initMoves() { .makesContact(false) .target(MoveTarget.ATTACKER), new AttackMove(Moves.U_TURN, Type.BUG, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4) - .attr(ForceSwitchOutAttr, true, false), + .attr(ForceSwitchOutAttr, true), new AttackMove(Moves.CLOSE_COMBAT, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true), new AttackMove(Moves.PAYBACK, Type.DARK, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 4) @@ -8253,7 +8252,7 @@ export function initMoves() { new AttackMove(Moves.GRASS_PLEDGE, Type.GRASS, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) .partial(), new AttackMove(Moves.VOLT_SWITCH, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 5) - .attr(ForceSwitchOutAttr, true, false), + .attr(ForceSwitchOutAttr, true), new AttackMove(Moves.STRUGGLE_BUG, Type.BUG, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), @@ -8421,7 +8420,7 @@ export function initMoves() { .target(MoveTarget.ALL_NEAR_ENEMIES), new StatusMove(Moves.PARTING_SHOT, Type.DARK, 100, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, false, null, true, true, MoveEffectTrigger.PRE_APPLY) - .attr(ForceSwitchOutAttr, true, false) + .attr(ForceSwitchOutAttr, true) .soundBased(), new StatusMove(Moves.TOPSY_TURVY, Type.DARK, -1, 20, -1, 0, 6) .attr(InvertStatsAttr), @@ -9176,7 +9175,7 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], 1) .target(MoveTarget.NEAR_ALLY), new AttackMove(Moves.FLIP_TURN, Type.WATER, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 8) - .attr(ForceSwitchOutAttr, true, false), + .attr(ForceSwitchOutAttr, true), new AttackMove(Moves.TRIPLE_AXEL, Type.ICE, MoveCategory.PHYSICAL, 20, 90, 10, -1, 0, 8) .attr(MultiHitAttr, MultiHitType._3) .attr(MultiHitPowerIncrementAttr, 3) @@ -9503,10 +9502,11 @@ export function initMoves() { .attr(MovePowerMultiplierAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2 ? 5461/4096 : 1) .makesContact(), new SelfStatusMove(Moves.SHED_TAIL, Type.NORMAL, -1, 10, -1, 0, 9) - .unimplemented(), + .attr(AddSubstituteAttr, 0.5) + .attr(ForceSwitchOutAttr, true, SwitchType.SHED_TAIL), new SelfStatusMove(Moves.CHILLY_RECEPTION, Type.ICE, -1, 10, -1, 0, 9) .attr(PreMoveMessageAttr, (user, move) => i18next.t("moveTriggers:chillyReception", {pokemonName: getPokemonNameWithAffix(user)})) - .attr(ChillyReceptionAttr, true, false), + .attr(ChillyReceptionAttr, true), new SelfStatusMove(Moves.TIDY_UP, Type.NORMAL, -1, 10, -1, 0, 9) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPD ], 1, true, null, true, true) .attr(RemoveArenaTrapAttr, true) diff --git a/src/enums/switch-type.ts b/src/enums/switch-type.ts new file mode 100644 index 00000000000..b25ba6ad119 --- /dev/null +++ b/src/enums/switch-type.ts @@ -0,0 +1,12 @@ +/** + * Indicates the type of switch functionality that a {@linkcode SwitchPhase} + * or {@linkcode SwitchSummonPhase} will carry out. + */ +export enum SwitchType { + /** Basic switchout where the Pokemon to switch in is selected */ + SWITCH, + /** Transfers stat stages and other effects from the returning Pokemon to the switched in Pokemon */ + BATON_PASS, + /** Transfers the returning Pokemon's Substitute to the switched in Pokemon */ + SHED_TAIL +} diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 14f93809414..21deb3790e1 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -61,6 +61,7 @@ import { Challenges } from "#enums/challenges"; import { PokemonAnimType } from "#app/enums/pokemon-anim-type"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { SwitchType } from "#enums/switch-type"; export enum FieldPosition { CENTER, @@ -4003,16 +4004,17 @@ export class PlayerPokemon extends Pokemon { /** * Causes this mon to leave the field (via {@linkcode leaveField}) and then * opens the party switcher UI to switch a new mon in - * @param batonPass Indicates if this switch was caused by a baton pass (and - * thus should maintain active mon effects) + * @param switchType the {@linkcode SwitchType} for this switch-out. If this is + * `BATON_PASS` or `SHED_TAIL`, this Pokemon's effects are not cleared upon leaving + * the field. */ - switchOut(batonPass: boolean): Promise { + switchOut(switchType: SwitchType = SwitchType.SWITCH): Promise { return new Promise(resolve => { - this.leaveField(!batonPass); + this.leaveField(switchType === SwitchType.SWITCH); this.scene.ui.setMode(Mode.PARTY, PartyUiMode.FAINT_SWITCH, this.getFieldIndex(), (slotIndex: integer, option: PartyOption) => { if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) { - this.scene.prependToPhase(new SwitchSummonPhase(this.scene, this.getFieldIndex(), slotIndex, false, batonPass), MoveEndPhase); + this.scene.prependToPhase(new SwitchSummonPhase(this.scene, switchType, this.getFieldIndex(), slotIndex, false), MoveEndPhase); } this.scene.ui.setMode(Mode.MESSAGE).then(resolve); }, PartyUiHandler.FilterNonFainted); @@ -4074,11 +4076,11 @@ export class PlayerPokemon extends Pokemon { const allyPokemon = this.getAlly(); if (slotIndex<=1) { // Revived ally pokemon - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, pokemon.getFieldIndex(), slotIndex, false, false, true)); + this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, true)); this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); } else if (allyPokemon.isFainted()) { // Revived party pokemon, and ally pokemon is fainted - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, allyPokemon.getFieldIndex(), slotIndex, false, false, true)); + this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, true)); this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); } } diff --git a/src/locales/de/battler-tags.json b/src/locales/de/battler-tags.json index 2f8a8d0c438..6cc0e93ffb2 100644 --- a/src/locales/de/battler-tags.json +++ b/src/locales/de/battler-tags.json @@ -71,6 +71,7 @@ "disabledOnAdd": " {{moveName}} von {{pokemonNameWithAffix}} wurde blockiert!", "disabledLapse": "{{moveName}} von {{pokemonNameWithAffix}} ist nicht länger blockiert!", "tarShotOnAdd": "{{pokemonNameWithAffix}} ist nun schwach gegenüber Feuer-Attacken!", + "shedTailOnAdd": "{{pokemonNameWithAffix}} wirft seinen Schwanz ab, um eine Ablenkung zu schaffen!", "substituteOnAdd": "Ein Delegator von {{pokemonNameWithAffix}} ist erschienen!", "substituteOnHit": "Der Delegator steckt den Schlag für {{pokemonNameWithAffix}} ein!", "substituteOnRemove": "Der Delegator von {{pokemonNameWithAffix}} hört auf zu wirken!" diff --git a/src/locales/en/battler-tags.json b/src/locales/en/battler-tags.json index 6a5eeee2577..520ac2a6202 100644 --- a/src/locales/en/battler-tags.json +++ b/src/locales/en/battler-tags.json @@ -71,6 +71,7 @@ "disabledOnAdd": "{{pokemonNameWithAffix}}'s {{moveName}}\nwas disabled!", "disabledLapse": "{{pokemonNameWithAffix}}'s {{moveName}}\nis no longer disabled.", "tarShotOnAdd": "{{pokemonNameWithAffix}} became weaker to fire!", + "shedTailOnAdd": "{{pokemonNameWithAffix}} shed its tail to create a decoy!", "substituteOnAdd": "{{pokemonNameWithAffix}} put in a substitute!", "substituteOnHit": "The substitute took damage for {{pokemonNameWithAffix}}!", "substituteOnRemove": "{{pokemonNameWithAffix}}'s substitute faded!", diff --git a/src/locales/es/battler-tags.json b/src/locales/es/battler-tags.json index bb4f0fe6c8a..b4d26f590c3 100644 --- a/src/locales/es/battler-tags.json +++ b/src/locales/es/battler-tags.json @@ -71,6 +71,7 @@ "disabledOnAdd": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!", "disabledLapse": "¡El movimiento {{moveName}} de {{pokemonNameWithAffix}} ya no está anulado!", "tarShotOnAdd": "¡{{pokemonNameWithAffix}} se ha vuelto débil ante el fuego!", + "shedTailOnAdd": "{{pokemonNameWithAffix}} se desprende\nde un segmento de su cuerpo y lo usa comoseñuelo!", "substituteOnAdd": "¡{{pokemonNameWithAffix}} creó un sustituto!", "substituteOnHit": "¡El sustituto recibe daño en lugar del {{pokemonNameWithAffix}}!", "substituteOnRemove": "¡El sustituto del {{pokemonNameWithAffix}} se debilitó!" diff --git a/src/locales/fr/battler-tags.json b/src/locales/fr/battler-tags.json index 93b70490ed6..b52f688320e 100644 --- a/src/locales/fr/battler-tags.json +++ b/src/locales/fr/battler-tags.json @@ -71,6 +71,7 @@ "disabledOnAdd": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} est mise sous entrave !", "disabledLapse": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} n’est plus sous entrave !", "tarShotOnAdd": "{{pokemonNameWithAffix}} est maintenant\nvulnérable au feu !", + "shedTailOnAdd": "{{pokemonNameWithAffix}} détache\nsa queue pour créer un leurre !", "substituteOnAdd": "{{pokemonNameWithAffix}}\ncrée un clone !", "substituteOnHit": "Le clone subit les dégâts à la place\nde {{pokemonNameWithAffix}} !", "substituteOnRemove": "Le clone de {{pokemonNameWithAffix}}\ndisparait…" diff --git a/src/locales/it/battler-tags.json b/src/locales/it/battler-tags.json index 6ab69f4efa2..a7062c46677 100644 --- a/src/locales/it/battler-tags.json +++ b/src/locales/it/battler-tags.json @@ -71,6 +71,7 @@ "disabledOnAdd": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} è stata bloccata!", "disabledLapse": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} non è più bloccata!", "tarShotOnAdd": "{{pokemonNameWithAffix}} è diventato vulnerabile\nal tipo Fuoco!", + "shedTailOnAdd": "{{pokemonNameWithAffix}} si taglia\nla coda e ne fa un sostituto!", "substituteOnAdd": "Appare un sostituto di {{pokemonNameWithAffix}}!", "substituteOnHit": "Il sostituto viene colpito al posto di {{pokemonNameWithAffix}}!", "substituteOnRemove": "Il sostituto di {{pokemonNameWithAffix}} svanisce!" diff --git a/src/locales/ja/battler-tags.json b/src/locales/ja/battler-tags.json index f8c6d44c0b4..fef8def1328 100644 --- a/src/locales/ja/battler-tags.json +++ b/src/locales/ja/battler-tags.json @@ -70,5 +70,6 @@ "stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!", "disabledOnAdd": "{{pokemonNameWithAffix}}の\n{{moveName}}\nを 封じこめた!", "disabledLapse": "{{pokemonNameWithAffix}}の\nかなしばりが 解けた!", - "tarShotOnAdd": "{{pokemonNameWithAffix}}は ほのおに 弱くなった!" + "tarShotOnAdd": "{{pokemonNameWithAffix}}は ほのおに 弱くなった!", + "shedTailOnAdd": "{{pokemonNameWithAffix}}は\nしっぽを 切って みがわりにした!" } diff --git a/src/locales/ko/battler-tags.json b/src/locales/ko/battler-tags.json index 1cd6c86377e..53fab7d10ba 100644 --- a/src/locales/ko/battler-tags.json +++ b/src/locales/ko/battler-tags.json @@ -71,6 +71,7 @@ "disabledOnAdd": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다!", "disabledLapse": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n이제 사용할 수 있다.", "tarShotOnAdd": "{{pokemonNameWithAffix}}[[는]] 불꽃에 약해졌다!", + "shedTailOnAdd": "{{pokemonNameWithAffix}}[[는]] 꼬리를 잘라 대타로 삼았다!", "substituteOnAdd": "{{pokemonNameWithAffix}}의\n대타가 나타났다!", "substituteOnHit": "{{pokemonNameWithAffix}}[[를]] 대신하여\n대타가 공격을 받았다!", "substituteOnRemove": "{{pokemonNameWithAffix}}의\n대타는 사라져 버렸다..." diff --git a/src/locales/zh_CN/battler-tags.json b/src/locales/zh_CN/battler-tags.json index a7859380b7a..565fa8e754e 100644 --- a/src/locales/zh_CN/battler-tags.json +++ b/src/locales/zh_CN/battler-tags.json @@ -71,6 +71,7 @@ "disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{{moveName}}!", "disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了!", "tarShotOnAdd": "{{pokemonNameWithAffix}}\n变得怕火了!", + "shedTailOnAdd": "{{pokemonNameWithAffix}}\n断掉尾巴并将其作为替身了!", "substituteOnAdd": "{{pokemonNameWithAffix}}的\n替身出现了!", "substituteOnHit": "替身代替{{pokemonNameWithAffix}}\n承受了攻击!", "substituteOnRemove": "{{pokemonNameWithAffix}}的\n替身消失了……" diff --git a/src/locales/zh_TW/battler-tags.json b/src/locales/zh_TW/battler-tags.json index 49b19f5efdc..d6cb5d0aa43 100644 --- a/src/locales/zh_TW/battler-tags.json +++ b/src/locales/zh_TW/battler-tags.json @@ -71,6 +71,7 @@ "disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{moveName}}!", "disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了!", "tarShotOnAdd": "{{pokemonNameWithAffix}}\n變得怕火了!", + "shedTailOnAdd": "{{pokemonNameWithAffix}}\n截斷尾巴,把它做成了替身!", "substituteOnAdd": "{{pokemonNameWithAffix}}的\n替身出現了!", "substituteOnHit": "替身代替{{pokemonNameWithAffix}}承受了攻擊!", "substituteOnRemove": "{{pokemonNameWithAffix}}的\n替身消失了……" diff --git a/src/phases/check-switch-phase.ts b/src/phases/check-switch-phase.ts index a069ba224a2..8849d304435 100644 --- a/src/phases/check-switch-phase.ts +++ b/src/phases/check-switch-phase.ts @@ -8,6 +8,7 @@ import { BattlePhase } from "./battle-phase"; import { PostSummonPhase } from "./post-summon-phase"; import { SummonMissingPhase } from "./summon-missing-phase"; import { SwitchPhase } from "./switch-phase"; +import { SwitchType } from "#enums/switch-type"; export class CheckSwitchPhase extends BattlePhase { protected fieldIndex: integer; @@ -50,7 +51,7 @@ export class CheckSwitchPhase extends BattlePhase { this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.setMode(Mode.MESSAGE); this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex); - this.scene.unshiftPhase(new SwitchPhase(this.scene, this.fieldIndex, false, true)); + this.scene.unshiftPhase(new SwitchPhase(this.scene, SwitchType.SWITCH, this.fieldIndex, false, true)); this.end(); }, () => { this.scene.ui.setMode(Mode.MESSAGE); diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index 41384e5e491..ba25225f6e0 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -18,6 +18,7 @@ import { GameOverPhase } from "./game-over-phase"; import { SwitchPhase } from "./switch-phase"; import { VictoryPhase } from "./victory-phase"; import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; +import { SwitchType } from "#enums/switch-type"; export class FaintPhase extends PokemonPhase { private preventEndure: boolean; @@ -106,14 +107,14 @@ export class FaintPhase extends PokemonPhase { * If previous conditions weren't met, and the player has at least 1 legal Pokemon off the field, * push a phase that prompts the player to summon a Pokemon from their party. */ - this.scene.pushPhase(new SwitchPhase(this.scene, this.fieldIndex, true, false)); + this.scene.pushPhase(new SwitchPhase(this.scene, SwitchType.SWITCH, this.fieldIndex, true, false)); } } else { this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); if ([BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER].includes(this.scene.currentBattle.battleType)) { const hasReservePartyMember = !!this.scene.getEnemyParty().filter(p => p.isActive() && !p.isOnField() && p.trainerSlot === (pokemon as EnemyPokemon).trainerSlot).length; if (hasReservePartyMember) { - this.scene.pushPhase(new SwitchSummonPhase(this.scene, this.fieldIndex, -1, false, false, false)); + this.scene.pushPhase(new SwitchSummonPhase(this.scene, SwitchType.SWITCH, this.fieldIndex, -1, false, false)); } } } diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 007b69650b9..60755095cca 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -24,6 +24,7 @@ import { NewBattlePhase } from "#app/phases/new-battle-phase"; import { GameOverPhase } from "#app/phases/game-over-phase"; import { SwitchPhase } from "#app/phases/switch-phase"; import { SeenEncounterData } from "#app/data/mystery-encounters/mystery-encounter-save-data"; +import { SwitchType } from "#enums/switch-type"; /** * Will handle (in order): @@ -241,7 +242,7 @@ export class MysteryEncounterBattleStartCleanupPhase extends Phase { const playerField = this.scene.getPlayerField(); playerField.forEach((pokemon, i) => { if (!pokemon.isAllowedInBattle() && legalPlayerPartyPokemon.length > i) { - this.scene.unshiftPhase(new SwitchPhase(this.scene, i, true, false)); + this.scene.unshiftPhase(new SwitchPhase(this.scene, SwitchType.SWITCH, i, true, false)); } }); diff --git a/src/phases/return-phase.ts b/src/phases/return-phase.ts index 19c73816b36..eb587201585 100644 --- a/src/phases/return-phase.ts +++ b/src/phases/return-phase.ts @@ -1,10 +1,11 @@ import BattleScene from "#app/battle-scene"; import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; +import { SwitchType } from "#enums/switch-type"; import { SwitchSummonPhase } from "./switch-summon-phase"; export class ReturnPhase extends SwitchSummonPhase { constructor(scene: BattleScene, fieldIndex: integer) { - super(scene, fieldIndex, -1, true, false); + super(scene, SwitchType.SWITCH, fieldIndex, -1, true); } switchAndSummon(): void { diff --git a/src/phases/switch-phase.ts b/src/phases/switch-phase.ts index b1a2e991ed8..f5ce2179715 100644 --- a/src/phases/switch-phase.ts +++ b/src/phases/switch-phase.ts @@ -1,4 +1,5 @@ import BattleScene from "#app/battle-scene"; +import { SwitchType } from "#enums/switch-type"; import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; import { BattlePhase } from "./battle-phase"; @@ -9,22 +10,25 @@ import { SwitchSummonPhase } from "./switch-summon-phase"; * for the player (if a switch would be valid for the current battle state). */ export class SwitchPhase extends BattlePhase { - protected fieldIndex: integer; - private isModal: boolean; - private doReturn: boolean; + protected readonly fieldIndex: integer; + private readonly switchType: SwitchType; + private readonly isModal: boolean; + private readonly doReturn: boolean; /** * Creates a new SwitchPhase * @param scene {@linkcode BattleScene} Current battle scene + * @param switchType {@linkcode SwitchType} The type of switch logic this phase implements * @param fieldIndex Field index to switch out * @param isModal Indicates if the switch should be forced (true) or is * optional (false). * @param doReturn Indicates if the party member on the field should be * recalled to ball or has already left the field. Passed to {@linkcode SwitchSummonPhase}. */ - constructor(scene: BattleScene, fieldIndex: integer, isModal: boolean, doReturn: boolean) { + constructor(scene: BattleScene, switchType: SwitchType, fieldIndex: integer, isModal: boolean, doReturn: boolean) { super(scene); + this.switchType = switchType; this.fieldIndex = fieldIndex; this.isModal = isModal; this.doReturn = doReturn; @@ -38,11 +42,13 @@ export class SwitchPhase extends BattlePhase { return super.end(); } - // Skip if the fainted party member has been revived already. doReturn is - // only passed as `false` from FaintPhase (as opposed to other usages such - // as ForceSwitchOutAttr or CheckSwitchPhase), so we only want to check this - // if the mon should have already been returned but is still alive and well - // on the field. see also; battle.test.ts + /** + * Skip if the fainted party member has been revived already. doReturn is + * only passed as `false` from FaintPhase (as opposed to other usages such + * as ForceSwitchOutAttr or CheckSwitchPhase), so we only want to check this + * if the mon should have already been returned but is still alive and well + * on the field. see also; battle.test.ts + */ if (this.isModal && !this.doReturn && !this.scene.getParty()[this.fieldIndex].isFainted()) { return super.end(); } @@ -57,7 +63,8 @@ export class SwitchPhase extends BattlePhase { this.scene.ui.setMode(Mode.PARTY, this.isModal ? PartyUiMode.FAINT_SWITCH : PartyUiMode.POST_BATTLE_SWITCH, fieldIndex, (slotIndex: integer, option: PartyOption) => { if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) { - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, fieldIndex, slotIndex, this.doReturn, option === PartyOption.PASS_BATON)); + const switchType = (option === PartyOption.PASS_BATON) ? SwitchType.BATON_PASS : this.switchType; + this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, switchType, fieldIndex, slotIndex, this.doReturn)); } this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); }, PartyUiHandler.FilterNonFainted); diff --git a/src/phases/switch-summon-phase.ts b/src/phases/switch-summon-phase.ts index 525f74e896f..eb1e089543b 100644 --- a/src/phases/switch-summon-phase.ts +++ b/src/phases/switch-summon-phase.ts @@ -12,29 +12,30 @@ import i18next from "i18next"; import { PostSummonPhase } from "./post-summon-phase"; import { SummonPhase } from "./summon-phase"; import { SubstituteTag } from "#app/data/battler-tags"; +import { SwitchType } from "#enums/switch-type"; export class SwitchSummonPhase extends SummonPhase { - private slotIndex: integer; - private doReturn: boolean; - private batonPass: boolean; + private readonly switchType: SwitchType; + private readonly slotIndex: integer; + private readonly doReturn: boolean; private lastPokemon: Pokemon; /** * Constructor for creating a new SwitchSummonPhase * @param scene {@linkcode BattleScene} the scene the phase is associated with + * @param switchType the type of switch behavior * @param fieldIndex integer representing position on the battle field * @param slotIndex integer for the index of pokemon (in party of 6) to switch into * @param doReturn boolean whether to render "comeback" dialogue - * @param batonPass boolean if the switch is from baton pass * @param player boolean if the switch is from the player */ - constructor(scene: BattleScene, fieldIndex: integer, slotIndex: integer, doReturn: boolean, batonPass: boolean, player?: boolean) { + constructor(scene: BattleScene, switchType: SwitchType, fieldIndex: integer, slotIndex: integer, doReturn: boolean, player?: boolean) { super(scene, fieldIndex, player !== undefined ? player : true); + this.switchType = switchType; this.slotIndex = slotIndex; this.doReturn = doReturn; - this.batonPass = batonPass; } start(): void { @@ -64,7 +65,7 @@ export class SwitchSummonPhase extends SummonPhase { const pokemon = this.getPokemon(); - if (!this.batonPass) { + if (this.switchType === SwitchType.SWITCH) { (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.removeTagsBySourceId(pokemon.id)); const substitute = pokemon.getTag(SubstituteTag); if (substitute) { @@ -94,7 +95,7 @@ export class SwitchSummonPhase extends SummonPhase { ease: "Sine.easeIn", scale: 0.5, onComplete: () => { - pokemon.leaveField(!this.batonPass, false); + pokemon.leaveField(this.switchType === SwitchType.SWITCH, false); this.scene.time.delayedCall(750, () => this.switchAndSummon()); } }); @@ -105,7 +106,7 @@ export class SwitchSummonPhase extends SummonPhase { const switchedInPokemon = party[this.slotIndex]; this.lastPokemon = this.getPokemon(); applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, this.lastPokemon); - if (this.batonPass && switchedInPokemon) { + if (this.switchType === SwitchType.BATON_PASS && switchedInPokemon) { (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.transferTagsBySourceId(this.lastPokemon.id, switchedInPokemon.id)); if (!this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id)) { const batonPassModifier = this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier @@ -130,7 +131,7 @@ export class SwitchSummonPhase extends SummonPhase { * If this switch is passing a Substitute, make the switched Pokemon match the returned Pokemon's state as it left. * Otherwise, clear any persisting tags on the returned Pokemon. */ - if (this.batonPass) { + if (this.switchType === SwitchType.BATON_PASS || this.switchType === SwitchType.SHED_TAIL) { const substitute = this.lastPokemon.getTag(SubstituteTag); if (substitute) { switchedInPokemon.x += this.lastPokemon.getSubstituteOffset()[0]; @@ -174,8 +175,13 @@ export class SwitchSummonPhase extends SummonPhase { pokemon.battleSummonData.turnCount--; } - if (this.batonPass && pokemon) { + if (this.switchType === SwitchType.BATON_PASS && pokemon) { pokemon.transferSummon(this.lastPokemon); + } else if (this.switchType === SwitchType.SHED_TAIL && pokemon) { + const subTag = this.lastPokemon.getTag(SubstituteTag); + if (subTag) { + pokemon.summonData.tags.push(subTag); + } } this.lastPokemon?.resetSummonData(); diff --git a/src/phases/turn-init-phase.ts b/src/phases/turn-init-phase.ts index 92547878f12..2f1b539cdcf 100644 --- a/src/phases/turn-init-phase.ts +++ b/src/phases/turn-init-phase.ts @@ -32,7 +32,7 @@ export class TurnInitPhase extends FieldPhase { this.scene.unshiftPhase(new GameOverPhase(this.scene)); } else if (allowedPokemon.length >= this.scene.currentBattle.getBattlerCount() || (this.scene.currentBattle.double && !allowedPokemon[0].isActive(true))) { // If there is at least one pokemon in the back that is legal to switch in, force a switch. - p.switchOut(false); + p.switchOut(); } else { // If there are no pokemon in the back but we're not game overing, just hide the pokemon. // This should only happen in double battles. diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts index 5c1af4228c6..b070abb390a 100644 --- a/src/phases/turn-start-phase.ts +++ b/src/phases/turn-start-phase.ts @@ -19,6 +19,7 @@ import { TurnEndPhase } from "./turn-end-phase"; import { WeatherEffectPhase } from "./weather-effect-phase"; import { BattlerIndex } from "#app/battle"; import { TrickRoomTag } from "#app/data/arena-tag"; +import { SwitchType } from "#enums/switch-type"; export class TurnStartPhase extends FieldPhase { constructor(scene: BattleScene) { @@ -179,7 +180,8 @@ export class TurnStartPhase extends FieldPhase { this.scene.unshiftPhase(new AttemptCapturePhase(this.scene, turnCommand.targets![0] % 2, turnCommand.cursor!));//TODO: is the bang correct here? break; case Command.POKEMON: - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, pokemon.getFieldIndex(), turnCommand.cursor!, true, turnCommand.args![0] as boolean, pokemon.isPlayer()));//TODO: is the bang correct here? + const switchType = turnCommand.args?.[0] ? SwitchType.BATON_PASS : SwitchType.SWITCH; + this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, switchType, pokemon.getFieldIndex(), turnCommand.cursor!, true, pokemon.isPlayer())); break; case Command.RUN: let runningPokemon = pokemon; diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index c7cbd9014e0..b4c60aa7a7f 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -18,6 +18,7 @@ import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; import { Status, StatusEffect } from "#app/data/status-effect"; +import { SwitchType } from "#enums/switch-type"; @@ -113,7 +114,7 @@ describe("Abilities - ZEN MODE", () => { await game.phaseInterceptor.run(EnemyCommandPhase); await game.phaseInterceptor.run(TurnStartPhase); game.onNextPrompt("SwitchPhase", Mode.PARTY, () => { - game.scene.unshiftPhase(new SwitchSummonPhase(game.scene, 0, 1, false, false)); + game.scene.unshiftPhase(new SwitchSummonPhase(game.scene, SwitchType.SWITCH, 0, 1, false)); game.scene.ui.setMode(Mode.MESSAGE); }); game.onNextPrompt("SwitchPhase", Mode.MESSAGE, () => { diff --git a/src/test/moves/shed_tail.test.ts b/src/test/moves/shed_tail.test.ts new file mode 100644 index 00000000000..a976a614792 --- /dev/null +++ b/src/test/moves/shed_tail.test.ts @@ -0,0 +1,56 @@ +import { SubstituteTag } from "#app/data/battler-tags"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; + +describe("Moves - Shed Tail", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([Moves.SHED_TAIL]) + .battleType("single") + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("transfers a Substitute doll to the switched in Pokemon", async () => { + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); + + const magikarp = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SHED_TAIL); + game.doSelectPartyPokemon(1); + + await game.phaseInterceptor.to("TurnEndPhase", false); + + const feebas = game.scene.getPlayerPokemon()!; + const substituteTag = feebas.getTag(SubstituteTag); + + expect(feebas).not.toBe(magikarp); + expect(feebas.hp).toBe(feebas.getMaxHp()); + // Note: Shed Tail's HP cost is currently not accurate to mainline, as it + // should cost ceil(maxHP / 2) instead of max(floor(maxHp / 2), 1). The current + // implementation is consistent with Substitute's HP cost logic, but that's not + // the case in mainline for some reason :regiDespair:. + expect(magikarp.hp).toBe(Math.ceil(magikarp.getMaxHp() / 2)); + expect(substituteTag).toBeDefined(); + expect(substituteTag?.hp).toBe(Math.floor(magikarp.getMaxHp() / 4)); + }); +});