This commit is contained in:
Jacob Knispel 2024-05-16 03:54:30 -05:00
commit fe873c64ec
28 changed files with 732 additions and 385 deletions

View File

@ -4,6 +4,7 @@ import BattleScene from "../battle-scene";
import { Species } from "./enums/species"; import { Species } from "./enums/species";
import { getPokemonSpecies, speciesStarters } from "./pokemon-species"; import { getPokemonSpecies, speciesStarters } from "./pokemon-species";
import { EggTier } from "./enums/egg-type"; import { EggTier } from "./enums/egg-type";
import i18next from '../plugins/i18n';
export const EGG_SEED = 1073741824; export const EGG_SEED = 1073741824;
@ -56,34 +57,34 @@ export function getEggDescriptor(egg: Egg): string {
return 'Manaphy'; return 'Manaphy';
switch (egg.tier) { switch (egg.tier) {
case EggTier.GREAT: case EggTier.GREAT:
return 'Rare'; return i18next.t('egg:greatTier');
case EggTier.ULTRA: case EggTier.ULTRA:
return 'Epic'; return i18next.t('egg:ultraTier');
case EggTier.MASTER: case EggTier.MASTER:
return 'Legendary'; return i18next.t('egg:masterTier');
default: default:
return 'Common'; return i18next.t('egg:defaultTier');
} }
} }
export function getEggHatchWavesMessage(hatchWaves: integer): string { export function getEggHatchWavesMessage(hatchWaves: integer): string {
if (hatchWaves <= 5) if (hatchWaves <= 5)
return 'Sounds can be heard coming from inside! It will hatch soon!'; return i18next.t('egg:hatchWavesMessageSoon');
if (hatchWaves <= 15) if (hatchWaves <= 15)
return 'It appears to move occasionally. It may be close to hatching.'; return i18next.t('egg:hatchWavesMessageClose');
if (hatchWaves <= 50) if (hatchWaves <= 50)
return 'What will hatch from this? It doesn\'t seem close to hatching.'; return i18next.t('egg:hatchWavesMessageNotClose');
return 'It looks like this Egg will take a long time to hatch.'; return i18next.t('egg:hatchWavesMessageLongTime');
} }
export function getEggGachaTypeDescriptor(scene: BattleScene, egg: Egg): string { export function getEggGachaTypeDescriptor(scene: BattleScene, egg: Egg): string {
switch (egg.gachaType) { switch (egg.gachaType) {
case GachaType.LEGENDARY: case GachaType.LEGENDARY:
return `Legendary Rate Up (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, egg.timestamp)).getName()})`; return `${i18next.t('egg:gachaTypeLegendary')} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, egg.timestamp)).getName()})`;
case GachaType.MOVE: case GachaType.MOVE:
return 'Rare Egg Move Rate Up'; return i18next.t('egg:gachaTypeMove');
case GachaType.SHINY: case GachaType.SHINY:
return 'Shiny Rate Up'; return i18next.t('egg:gachaTypeShiny');
} }
} }

View File

@ -1,37 +1,45 @@
export const battleCountSplashMessage = '{COUNT} Battles Won!'; import i18next from "../plugins/i18n";
export const splashMessages = Array(10).fill(battleCountSplashMessage); export function getBattleCountSplashMessage(): string {
splashMessages.push(...[ return `{COUNT} ${i18next.t('splashMessages:battlesWon')}`;
'Join the Discord!', }
'Infinite Levels!',
'Everything Stacks!', export function getSplashMessages(): string[] {
'Optional Save Scumming!', const splashMessages = Array(10).fill(getBattleCountSplashMessage());
'35 Biomes!', splashMessages.push(...[
'Open Source!', i18next.t('splashMessages:joinTheDiscord'),
'Play with 5x Speed!', i18next.t('splashMessages:infiniteLevel'),
'Live Bug Testing!', i18next.t('splashMessages:everythingStacks'),
'Heavy RoR2 Influence!', i18next.t('splashMessages:optionalSaveScumming'),
'Pokémon Risk and Pokémon Rain!', i18next.t('splashMessages:biomes'),
'Now with 33% More Salt!', i18next.t('splashMessages:openSource'),
'Infinite Fusion at Home!', i18next.t('splashMessages:playWith5xSpeed'),
'Broken Egg Moves!', i18next.t('splashMessages:liveBugTesting'),
'Magnificent!', i18next.t('splashMessages:heavyRoR2Influence'),
'Mubstitute!', i18next.t('splashMessages:pokemonRiskAndPokemonRain'),
'That\'s Crazy!', i18next.t('splashMessages:nowWithMoreSalt'),
'Orance Juice!', i18next.t('splashMessages:infiniteFusionAtHome'),
'Questionable Balancing!', i18next.t('splashMessages:brokenEggMoves'),
'Cool Shaders!', i18next.t('splashMessages:magnificent'),
'AI-Free!', i18next.t('splashMessages:mubstitute'),
'Sudden Difficulty Spikes!', i18next.t('splashMessages:thatsCrazy'),
'Based on an Unfinished Flash Game!', i18next.t('splashMessages:oranceJuice'),
'More Addictive than Intended!', i18next.t('splashMessages:questionableBalancing'),
'Mostly Consistent Seeds!', i18next.t('splashMessages:coolShaders'),
'Achievement Points Don\'t Do Anything!', i18next.t('splashMessages:aiFree'),
'You Do Not Start at Level 2000!', i18next.t('splashMessages:suddenDifficultySpikes'),
'Don\'t Talk About the Manaphy Egg Incident!', i18next.t('splashMessages:basedOnAnUnfinishedFlashGame'),
'Also Try Pokéngine!', i18next.t('splashMessages:moreAddictiveThanIntended'),
'Also Try Emerald Rogue!', i18next.t('splashMessages:mostlyConsistentSeeds'),
'Also Try Radical Red!', i18next.t('splashMessages:achievementPointsDontDoAnything'),
'Eevee Expo!', i18next.t('splashMessages:youDoNotStartAtLevel'),
'YNOproject!' i18next.t('splashMessages:dontTalkAboutTheManaphyEggIncident'),
]); i18next.t('splashMessages:alsoTryPokengine'),
i18next.t('splashMessages:alsoTryEmeraldRogue'),
i18next.t('splashMessages:alsoTryRadicalRed'),
i18next.t('splashMessages:eeveeExpo'),
i18next.t('splashMessages:ynoproject'),
]);
return splashMessages
}

View File

@ -2,6 +2,7 @@ import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger"; import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { egg } from "./egg";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
import { growth } from "./growth"; import { growth } from "./growth";
import { menu } from "./menu"; import { menu } from "./menu";
@ -14,6 +15,7 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { splashMessages } from "./splash-messages"
export const deConfig = { export const deConfig = {
@ -21,6 +23,7 @@ export const deConfig = {
abilityTriggers: abilityTriggers, abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
egg: egg,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
menuUiHandler: menuUiHandler, menuUiHandler: menuUiHandler,
menu: menu, menu: menu,
@ -30,6 +33,7 @@ export const deConfig = {
pokemon: pokemon, pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
splashMessages: splashMessages,
nature: nature, nature: nature,
growth: growth, growth: growth,
modifierType: modifierType, modifierType: modifierType,

21
src/locales/de/egg.ts Normal file
View File

@ -0,0 +1,21 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const egg: SimpleTranslationEntries = {
"egg": "Egg",
"greatTier": "Rare",
"ultraTier": "Epic",
"masterTier": "Legendary",
"defaultTier": "Common",
"hatchWavesMessageSoon": "Sounds can be heard coming from inside! It will hatch soon!",
"hatchWavesMessageClose": "It appears to move occasionally. It may be close to hatching.",
"hatchWavesMessageNotClose": "What will hatch from this? It doesn't seem close to hatching.",
"hatchWavesMessageLongTime": "It looks like this Egg will take a long time to hatch.",
"gachaTypeLegendary": "Legendary Rate Up",
"gachaTypeMove": "Rare Egg Move Rate Up",
"gachaTypeShiny": "Shiny Rate Up",
"selectMachine": "Select a machine.",
"notEnoughVouchers": "You don't have enough vouchers!",
"tooManyEggs": "You have too many eggs!",
"pull": "Pull",
"pulls": "Pulls"
} as const;

View File

@ -4,406 +4,407 @@ export const modifierType: ModifierTypeTranslationEntries = {
ModifierType: { ModifierType: {
"AddPokeballModifierType": { "AddPokeballModifierType": {
name: "{{modifierCount}}x {{pokeballName}}", name: "{{modifierCount}}x {{pokeballName}}",
description: "Receive {{pokeballName}} x{{modifierCount}} (Inventory: {{pokeballAmount}}) \nCatch Rate: {{catchRate}}", description: "Erhalte {{pokeballName}} x{{modifierCount}} (Inventar: {{pokeballAmount}}) \nFangrate: {{catchRate}}",
}, },
"AddVoucherModifierType": { "AddVoucherModifierType": {
name: "{{modifierCount}}x {{voucherTypeName}}", name: "{{modifierCount}}x {{voucherTypeName}}",
description: "Receive {{voucherTypeName}} x{{modifierCount}}", description: "Erhalte {{voucherTypeName}} x{{modifierCount}}",
}, },
"PokemonHeldItemModifierType": { "PokemonHeldItemModifierType": {
extra: { extra: {
"inoperable": "{{pokemonName}} can't take\nthis item!", "inoperable": "{{pokemonName}} kann dieses\nItem nicht nehmen!",
"tooMany": "{{pokemonName}} has too many\nof this item!", "tooMany": "{{pokemonName}} hat zu viele\nvon diesem Item!",
} }
}, },
"PokemonHpRestoreModifierType": { "PokemonHpRestoreModifierType": {
description: "Restores {{restorePoints}} HP or {{restorePercent}}% HP for one Pokémon, whichever is higher", description: "Füllt {{restorePoints}} KP oder {{restorePercent}}% der KP für ein Pokémon auf. Je nachdem, welcher Wert höher ist",
extra: { extra: {
"fully": "Fully restores HP for one Pokémon", "fully": "Füllt die KP eines Pokémon wieder vollständig auf.",
"fullyWithStatus": "Fully restores HP for one Pokémon and heals any status ailment", "fullyWithStatus": "Füllt die KP eines Pokémon wieder vollständig auf und behebt alle Statusprobleme",
} }
}, },
"PokemonReviveModifierType": { "PokemonReviveModifierType": {
description: "Revives one Pokémon and restores {{restorePercent}}% HP", description: "Belebt ein kampunfähiges Pokémon wieder und stellt {{restorePercent}}% KP wieder her",
}, },
"PokemonStatusHealModifierType": { "PokemonStatusHealModifierType": {
description: "Heals any status ailment for one Pokémon", description: "Behebt alle Statusprobleme eines Pokémon",
}, },
"PokemonPpRestoreModifierType": { "PokemonPpRestoreModifierType": {
description: "Restores {{restorePoints}} PP for one Pokémon move", description: "Füllt {{restorePoints}} AP der ausgewählten Attacke eines Pokémon auf",
extra: { extra: {
"fully": "Restores all PP for one Pokémon move", "fully": "Füllt alle AP der ausgewählten Attacke eines Pokémon auf",
} }
}, },
"PokemonAllMovePpRestoreModifierType": { "PokemonAllMovePpRestoreModifierType": {
description: "Restores {{restorePoints}} PP for all of one Pokémon's moves", description: "Stellt {{restorePoints}} AP für alle Attacken eines Pokémon auf",
extra: { extra: {
"fully": "Restores all PP for all of one Pokémon's moves", "fully": "Füllt alle AP für alle Attacken eines Pokémon auf",
} }
}, },
"PokemonPpUpModifierType": { "PokemonPpUpModifierType": {
description: "Permanently increases PP for one Pokémon move by {{upPoints}} for every 5 maximum PP (maximum 3)", description: "Erhöht die maximale Anzahl der AP der ausgewählten Attacke um {{upPoints}} für jede 5 maximale AP (maximal 3)",
}, },
"PokemonNatureChangeModifierType": { "PokemonNatureChangeModifierType": {
name: "{{natureName}} Mint", name: "{{natureName}} Minze",
description: "Changes a Pokémon's nature to {{natureName}} and permanently unlocks the nature for the starter.", description: "Ändert das Wesen zu {{natureName}}. Schaltet dieses Wesen permanent für diesen Starter frei.",
}, },
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
description: "Doubles the chance of an encounter being a double battle for {{battleCount}} battles", description: "Verdoppelt die Wahrscheinlichkeit, dass die nächsten {{battleCount}} Begegnungen mit wilden Pokémon ein Doppelkampf sind.",
}, },
"TempBattleStatBoosterModifierType": { "TempBattleStatBoosterModifierType": {
description: "Increases the {{tempBattleStatName}} of all party members by 1 stage for 5 battles", description: "Erhöht die {{tempBattleStatName}} aller Teammitglieder für 5 Kämpfe um eine Stufe",
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
description: "Increases the power of a Pokémon's {{moveType}}-type moves by 20%", description: "Erhöht die Stärke aller {{moveType}}attacken eines Pokémon um 20%",
}, },
"PokemonLevelIncrementModifierType": { "PokemonLevelIncrementModifierType": {
description: "Increases a Pokémon's level by 1", description: "Erhöht das Level eines Pokémon um 1",
}, },
"AllPokemonLevelIncrementModifierType": { "AllPokemonLevelIncrementModifierType": {
description: "Increases all party members' level by 1", description: "Erhöht das Level aller Teammitglieder um 1",
}, },
"PokemonBaseStatBoosterModifierType": { "PokemonBaseStatBoosterModifierType": {
description: "Increases the holder's base {{statName}} by 10%. The higher your IVs, the higher the stack limit.", description: "Erhöht den {{statName}} Basiswert des Trägers um 10%. Das Stapellimit erhöht sich, je höher dein IS-Wert ist.",
}, },
"AllPokemonFullHpRestoreModifierType": { "AllPokemonFullHpRestoreModifierType": {
description: "Restores 100% HP for all Pokémon", description: "Stellt 100% der KP aller Pokémon her",
}, },
"AllPokemonFullReviveModifierType": { "AllPokemonFullReviveModifierType": {
description: "Revives all fainted Pokémon, fully restoring HP", description: "Belebt alle kampunfähigen Pokémon wieder und stellt ihre KP vollständig wieder her",
}, },
"MoneyRewardModifierType": { "MoneyRewardModifierType": {
description: "Grants a {{moneyMultiplier}} amount of money (₽{{moneyAmount}})", description:"Gewährt einen {{moneyMultiplier}} Geldbetrag von (₽{{moneyAmount}})",
extra: { extra: {
"small": "small", "small": "kleinen",
"moderate": "moderate", "moderate": "moderaten",
"large": "large", "large": "großen",
}, },
}, },
"ExpBoosterModifierType": { "ExpBoosterModifierType": {
description: "Increases gain of EXP. Points by {{boostPercent}}%", description: "Erhöht die erhaltenen Erfahrungspunkte um {{boostPercent}}%",
}, },
"PokemonExpBoosterModifierType": { "PokemonExpBoosterModifierType": {
description: "Increases the holder's gain of EXP. Points by {{boostPercent}}%", description: "Erhöht die Menge der erhaltenen Erfahrungspunkte für den Träger um {{boostPercent}}%",
}, },
"PokemonFriendshipBoosterModifierType": { "PokemonFriendshipBoosterModifierType": {
description: "Increases friendship gain per victory by 50%", description: "Erhöht den Freundschaftszuwachs pro Sieg um 50%.",
}, },
"PokemonMoveAccuracyBoosterModifierType": { "PokemonMoveAccuracyBoosterModifierType": {
description: "Increases move accuracy by {{accuracyAmount}} (maximum 100)", description: "Erhöht die Genauigkeit der Angriffe um {{accuracyAmount}} (maximal 100)",
}, },
"PokemonMultiHitModifierType": { "PokemonMultiHitModifierType": {
description: "Attacks hit one additional time at the cost of a 60/75/82.5% power reduction per stack respectively", description: "Attacken treffen ein weiteres mal mit einer Reduktion von 60/75/82,5% der Stärke",
}, },
"TmModifierType": { "TmModifierType": {
name: "TM{{moveId}} - {{moveName}}", name: "TM{{moveId}} - {{moveName}}",
description: "Teach {{moveName}} to a Pokémon", description: "Bringt einem Pokémon {{moveName}} bei",
}, },
"EvolutionItemModifierType": { "EvolutionItemModifierType": {
description: "Causes certain Pokémon to evolve", description: "Erlaubt es bestimmten Pokémon sich zu entwickeln",
}, },
"FormChangeItemModifierType": { "FormChangeItemModifierType": {
description: "Causes certain Pokémon to change form", description: "Erlaubt es bestimmten Pokémon ihre Form zu ändern",
}, },
"FusePokemonModifierType": { "FusePokemonModifierType": {
description: "Combines two Pokémon (transfers Ability, splits base stats and types, shares move pool)", description: "Fusioniert zwei Pokémon (überträgt die Fähigkeit, teilt Basiswerte und Typ auf, gemeinsamer Attackenpool)",
}, },
"TerastallizeModifierType": { "TerastallizeModifierType": {
name: "{{teraType}} Tera Shard", name: "{{teraType}} Terra-Stück",
description: "{{teraType}} Terastallizes the holder for up to 10 battles", description: "{{teraType}} Terakristallisiert den Träger für bis zu 10 Kämpfe",
}, },
"ContactHeldItemTransferChanceModifierType": { "ContactHeldItemTransferChanceModifierType": {
description: "Upon attacking, there is a {{chancePercent}}% chance the foe's held item will be stolen", description:"Beim Angriff besteht eine {{chancePercent}}%ige Chance, dass das getragene Item des Gegners gestohlen wird."
}, },
"TurnHeldItemTransferModifierType": { "TurnHeldItemTransferModifierType": {
description: "Every turn, the holder acquires one held item from the foe", description: "Jede Runde erhält der Träger ein getragenes Item des Gegners",
}, },
"EnemyAttackStatusEffectChanceModifierType": { "EnemyAttackStatusEffectChanceModifierType": {
description: "Adds a {{chancePercent}}% chance to inflict {{statusEffect}} with attack moves", description: "Fügt Angriffen eine {{chancePercent}}%ige Chance hinzu, {{statusEffect}} zu verursachen",
}, },
"EnemyEndureChanceModifierType": { "EnemyEndureChanceModifierType": {
description: "Adds a {{chancePercent}}% chance of enduring a hit", description: "Gibt den Träger eine {{chancePercent}}%ige Chance, einen Angriff zu überleben",
}, },
"RARE_CANDY": { name: "Rare Candy" }, "RARE_CANDY": { name: "Sonderbonbon" },
"RARER_CANDY": { name: "Rarer Candy" }, "RARER_CANDY": { name: "Supersondererbonbon" },
"MEGA_BRACELET": { name: "Mega Bracelet", description: "Mega Stones become available" }, "MEGA_BRACELET": { name: "Mega-Armband", description: "Mega-Steine werden verfügbar" },
"DYNAMAX_BAND": { name: "Dynamax Band", description: "Max Mushrooms become available" }, "DYNAMAX_BAND": { name: "Dynamax-Band", description: "Dyna-Pilze werden verfügbar" },
"TERA_ORB": { name: "Tera Orb", description: "Tera Shards become available" }, "TERA_ORB": { name: "Terakristall-Orb", description: "Tera-Stücke werden verfügbar" },
"MAP": { name: "Map", description: "Allows you to choose your destination at a crossroads" }, "MAP": { name: "Karte", description: "Ermöglicht es dir, an einer Kreuzung dein Ziel zu wählen." },
"POTION": { name: "Potion" }, "POTION": { name: "Trank" },
"SUPER_POTION": { name: "Super Potion" }, "SUPER_POTION": { name: "Supertrank" },
"HYPER_POTION": { name: "Hyper Potion" }, "HYPER_POTION": { name: "Hypertrank" },
"MAX_POTION": { name: "Max Potion" }, "MAX_POTION": { name: "Top-Trank" },
"FULL_RESTORE": { name: "Full Restore" }, "FULL_RESTORE": { name: "Top-Genesung" },
"REVIVE": { name: "Revive" },
"MAX_REVIVE": { name: "Max Revive" },
"FULL_HEAL": { name: "Full Heal" },
"SACRED_ASH": { name: "Sacred Ash" }, "REVIVE": { name: "Beleber" },
"MAX_REVIVE": { name: "Top-Beleber" },
"REVIVER_SEED": { name: "Reviver Seed", description: "Revives the holder for 1/2 HP upon fainting" }, "FULL_HEAL": { name: "Hyperheiler" },
"ETHER": { name: "Ether" }, "SACRED_ASH": { name: "Zauberasche" },
"MAX_ETHER": { name: "Max Ether" },
"REVIVER_SEED": { name: "Belebersamen", description: "Belebt den Träger mit der Hälfte seiner KP wieder sollte er kampfunfähig werden" },
"ETHER": { name: "Äther" },
"MAX_ETHER": { name: "Top-Äther" },
"ELIXIR": { name: "Elixir" }, "ELIXIR": { name: "Elixir" },
"MAX_ELIXIR": { name: "Max Elixir" }, "MAX_ELIXIR": { name: "Top-Elixir" },
"PP_UP": { name: "PP Up" }, "PP_UP": { name: "AP-Plus" },
"PP_MAX": { name: "PP Max" }, "PP_MAX": { name: "AP-Top" },
"LURE": { name: "Lure" }, "LURE": { name: "Lockparfüm" },
"SUPER_LURE": { name: "Super Lure" }, "SUPER_LURE": { name: "Super-Lockparfüm" },
"MAX_LURE": { name: "Max Lure" }, "MAX_LURE": { name: "Top-Lockparfüm" },
"MEMORY_MUSHROOM": { name: "Memory Mushroom", description: "Recall one Pokémon's forgotten move" }, "MEMORY_MUSHROOM": { name: "Erinnerungspilz", description: "Lässt ein Pokémon eine vergessene Attacke wiedererlernen" },
"EXP_SHARE": { name: "EXP. All", description: "Non-participants receive 20% of a single participant's EXP. Points" }, "EXP_SHARE": { name: "EP-Teiler", description: "Pokémon, die nicht am Kampf teilgenommen haben, bekommen 20% der Erfahrungspunkte eines Kampfteilnehmers" },
"EXP_BALANCE": { name: "EXP. Balance", description: "Weighs EXP. Points received from battles towards lower-leveled party members" }, "EXP_BALANCE": { name: "EP-Ausgleicher", description: "Gewichtet die in Kämpfen erhaltenen Erfahrungspunkte auf niedrigstufigere Gruppenmitglieder." },
"OVAL_CHARM": { name: "Oval Charm", description: "When multiple Pokémon participate in a battle, each gets an extra 10% of the total EXP" }, "OVAL_CHARM": { name: "Ovalpin", description: "Wenn mehrere Pokémon am Kampf teilnehmen, erhählt jeder von ihnen 10% extra Erfahrungspunkte" },
"EXP_CHARM": { name: "EXP. Charm" }, "EXP_CHARM": { name: "EP-Pin" },
"SUPER_EXP_CHARM": { name: "Super EXP. Charm" }, "SUPER_EXP_CHARM": { name: "Super-EP-Pin" },
"GOLDEN_EXP_CHARM": { name: "Golden EXP. Charm" }, "GOLDEN_EXP_CHARM": { name: "Goldener EP-Pin" },
"LUCKY_EGG": { name: "Lucky Egg" }, "LUCKY_EGG": { name: "Glücks-Ei" },
"GOLDEN_EGG": { name: "Golden Egg" }, "GOLDEN_EGG": { name: "Goldenes Ei" },
"SOOTHE_BELL": { name: "Soothe Bell" }, "SOOTHE_BELL": { name: "Sanftglocke" },
"SOUL_DEW": { name: "Soul Dew", description: "Increases the influence of a Pokémon's nature on its stats by 10% (additive)" }, "SOUL_DEW": { name: "Seelentau", description: "Erhöht den Einfluss des Wesens eines Pokemon auf seine Werte um 10% (additiv)" },
"NUGGET": { name: "Nugget" }, "NUGGET": { name: "Nugget" },
"BIG_NUGGET": { name: "Big Nugget" }, "BIG_NUGGET": { name: "Riesennugget" },
"RELIC_GOLD": { name: "Relic Gold" }, "RELIC_GOLD": { name: "Alter Dukat" },
"AMULET_COIN": { name: "Amulet Coin", description: "Increases money rewards by 20%" }, "AMULET_COIN": { name: "Münzamulett", description: "Erhöht das Preisgeld um 20%" },
"GOLDEN_PUNCH": { name: "Golden Punch", description: "Grants 50% of damage inflicted as money" }, "GOLDEN_PUNCH": { name: "Goldschlag", description: "Gewährt Geld in Höhe von 50% des zugefügten Schadens" },
"COIN_CASE": { name: "Coin Case", description: "After every 10th battle, receive 10% of your money in interest" }, "COIN_CASE": { name: "Münzkorb", description: "Erhalte nach jedem 10ten Kampf 10% Zinsen auf dein Geld" },
"LOCK_CAPSULE": { name: "Lock Capsule", description: "Allows you to lock item rarities when rerolling items" },
"GRIP_CLAW": { name: "Grip Claw" }, "LOCK_CAPSULE": { name: "Tresorkapsel", description: "Erlaubt es die Seltenheitsstufe der Items festzusetzen wenn diese neu gerollt werden" },
"WIDE_LENS": { name: "Wide Lens" },
"MULTI_LENS": { name: "Multi Lens" },
"HEALING_CHARM": { name: "Healing Charm", description: "Increases the effectiveness of HP restoring moves and items by 10% (excludes Revives)" }, "GRIP_CLAW": { name: "Griffklaue" },
"CANDY_JAR": { name: "Candy Jar", description: "Increases the number of levels added by Rare Candy items by 1" }, "WIDE_LENS": { name: "Großlinse" },
"BERRY_POUCH": { name: "Berry Pouch", description: "Adds a 25% chance that a used berry will not be consumed" }, "MULTI_LENS": { name: "Mehrfachlinse" },
"FOCUS_BAND": { name: "Focus Band", description: "Adds a 10% chance to survive with 1 HP after being damaged enough to faint" }, "HEALING_CHARM": { name: "Heilungspin", description: "Erhöht die Effektivität von Heilungsattacken sowie Heilitems um 10% (Beleber ausgenommen)" },
"CANDY_JAR": { name: "Bonbonglas", description: "Erhöht die Anzahl der Level die ein Sonderbonbon erhöht um 1" },
"QUICK_CLAW": { name: "Quick Claw", description: "Adds a 10% chance to move first regardless of speed (after priority)" }, "BERRY_POUCH": { name: "Beerentüte", description: "Fügt eine 25% Chance hinzu, dass Beeren nicht verbraucht werden" },
"KINGS_ROCK": { name: "King's Rock", description: "Adds a 10% chance an attack move will cause the opponent to flinch" }, "FOCUS_BAND": { name: "Fokusband", description: "Fügt eine 10% Chance hinzu, dass Angriffe die zur Kampfunfähigkeit führen mit 1 KP überlebt werden" },
"LEFTOVERS": { name: "Leftovers", description: "Heals 1/16 of a Pokémon's maximum HP every turn" }, "QUICK_CLAW": { name: "Quick Claw", description: "Fügt eine 10% Change hinzu als erster anzugreifen. (Nach Prioritätsangriffen)" },
"SHELL_BELL": { name: "Shell Bell", description: "Heals 1/8 of a Pokémon's dealt damage" },
"BATON": { name: "Baton", description: "Allows passing along effects when switching Pokémon, which also bypasses traps" }, "KINGS_ROCK": { name: "King-Stein", description: "Fügt eine 10% Chance hinzu, dass der Gegner nach einem Angriff zurückschreckt" },
"SHINY_CHARM": { name: "Shiny Charm", description: "Dramatically increases the chance of a wild Pokémon being Shiny" }, "LEFTOVERS": { name: "Überreste", description: "Heilt 1/16 der maximalen KP eines Pokémon pro Runde" },
"ABILITY_CHARM": { name: "Ability Charm", description: "Dramatically increases the chance of a wild Pokémon having a Hidden Ability" }, "SHELL_BELL": { name: "Muschelglocke", description: "Heilt den Anwender um 1/8 des von ihm zugefügten Schadens" },
"IV_SCANNER": { name: "IV Scanner", description: "Allows scanning the IVs of wild Pokémon. 2 IVs are revealed per stack. The best IVs are shown first" }, "BATON": { name: "Stab", description: "Ermöglicht das Weitergeben von Effekten beim Wechseln von Pokémon, wodurch auch Fallen umgangen werden." },
"DNA_SPLICERS": { name: "DNA Splicers" }, "SHINY_CHARM": { name: "Schillerpin", description: "Erhöht die Chance deutlich, dass ein wildes Pokémon ein schillernd ist" },
"ABILITY_CHARM": { name: "Ability Charm", description: "Erhöht die Chance deutlich, dass ein wildes Pokémon eine versteckte Fähigkeit hat" },
"MINI_BLACK_HOLE": { name: "Mini Black Hole" }, "IV_SCANNER": { name: "IS-Scanner", description: "Erlaubt es die IS-Werte von wilden Pokémon zu scannen.\n(2 IS-Werte pro Staplung. Die besten IS-Werte zuerst)" },
"GOLDEN_POKEBALL": { name: "Golden Poké Ball", description: "Adds 1 extra item option at the end of every battle" }, "DNA_SPLICERS": { name: "DNS-Keil" },
"MINI_BLACK_HOLE": { name: "Mini schwarzes Loch" },
"GOLDEN_POKEBALL": { name: "Goldener Pokéball", description: "Fügt eine zusätzliche Item-Auswahlmöglichkeit nach jedem Kampf hinzu" },
"ENEMY_DAMAGE_BOOSTER": { name: "Schadensmarke", description: "Erhöht den Schaden um 5%" },
"ENEMY_DAMAGE_REDUCTION": { name: "Schutzmarke", description: "Verringert den erhaltenen Schaden um 2,5%" },
"ENEMY_HEAL": { name: "Wiederherstellungsmarke", description: "Heilt 2% der maximalen KP pro Runde" },
"ENEMY_ATTACK_POISON_CHANCE": { name: "Giftmarke" },
"ENEMY_ATTACK_PARALYZE_CHANCE": { "name": "Lähmungsmarke" },
"ENEMY_ATTACK_SLEEP_CHANCE": { "name": "Schlafmarke" },
"ENEMY_ATTACK_FREEZE_CHANCE": { "name": "Gefriermarke" },
"ENEMY_ATTACK_BURN_CHANCE": { "name": "Brandmarke" },
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { "name": "Vollheilungsmarke", "description": "Fügt eine 10%ige Chance hinzu, jede Runde einen Statuszustand zu heilen" },
"ENEMY_ENDURE_CHANCE": { "name": "Ausdauer-Marke" },
"ENEMY_FUSED_CHANCE": { "name": "Fusionsmarke", "description": "Fügt eine 1%ige Chance hinzu, dass ein wildes Pokémon eine Fusion ist" },
"ENEMY_DAMAGE_BOOSTER": { name: "Damage Token", description: "Increases damage by 5%" },
"ENEMY_DAMAGE_REDUCTION": { name: "Protection Token", description: "Reduces incoming damage by 2.5%" },
"ENEMY_HEAL": { name: "Recovery Token", description: "Heals 2% of max HP every turn" },
"ENEMY_ATTACK_POISON_CHANCE": { name: "Poison Token" },
"ENEMY_ATTACK_PARALYZE_CHANCE": { name: "Paralyze Token" },
"ENEMY_ATTACK_SLEEP_CHANCE": { name: "Sleep Token" },
"ENEMY_ATTACK_FREEZE_CHANCE": { name: "Freeze Token" },
"ENEMY_ATTACK_BURN_CHANCE": { name: "Burn Token" },
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Full Heal Token", description: "Adds a 10% chance every turn to heal a status condition" },
"ENEMY_ENDURE_CHANCE": { name: "Endure Token" },
"ENEMY_FUSED_CHANCE": { name: "Fusion Token", description: "Adds a 1% chance that a wild Pokémon will be a fusion" },
}, },
TempBattleStatBoosterItem: { TempBattleStatBoosterItem: {
"x_attack": "X Attack", "x_attack": "X-Angriff",
"x_defense": "X Defense", "x_defense": "X-Verteidigung",
"x_sp_atk": "X Sp. Atk", "x_sp_atk": "X-Sp.-Ang.",
"x_sp_def": "X Sp. Def", "x_sp_def": "X-Sp.-Vert.",
"x_speed": "X Speed", "x_speed": "X-Tempo",
"x_accuracy": "X Accuracy", "x_accuracy": "X-Treffer",
"dire_hit": "Dire Hit", "dire_hit": "X-Volltreffer",
}, },
AttackTypeBoosterItem: { AttackTypeBoosterItem: {
"silk_scarf": "Silk Scarf", "silk_scarf": "Seidenschal",
"black_belt": "Black Belt", "black_belt": "Schwarzgurt",
"sharp_beak": "Sharp Beak", "sharp_beak": "Spitzer Schnabel",
"poison_barb": "Poison Barb", "poison_barb": "Giftstich",
"soft_sand": "Soft Sand", "soft_sand": "Pudersand",
"hard_stone": "Hard Stone", "hard_stone": "Granitstein",
"silver_powder": "Silver Powder", "silver_powder": "Silberstaub",
"spell_tag": "Spell Tag", "spell_tag": "Bannsticker",
"metal_coat": "Metal Coat", "metal_coat": "Metallmantel",
"charcoal": "Charcoal", "charcoal": "Holzkohle",
"mystic_water": "Mystic Water", "mystic_water": "Zauberwasser",
"miracle_seed": "Miracle Seed", "miracle_seed": "Wundersaat",
"magnet": "Magnet", "magnet": "Magnet",
"twisted_spoon": "Twisted Spoon", "twisted_spoon": "Krümmlöffel",
"never_melt_ice": "Never-Melt Ice", "never_melt_ice": "Ewiges Eis",
"dragon_fang": "Dragon Fang", "dragon_fang": "Drachenzahn",
"black_glasses": "Black Glasses", "black_glasses": "Schattenbrille",
"fairy_feather": "Fairy Feather", "fairy_feather": "Feendaune",
}, },
BaseStatBoosterItem: { BaseStatBoosterItem: {
"hp_up": "HP Up", "hp_up": "KP-Plus",
"protein": "Protein", "protein": "Protein",
"iron": "Iron", "iron": "Eisen",
"calcium": "Calcium", "calcium": "Kalzium",
"zinc": "Zinc", "zinc": "Zink",
"carbos": "Carbos", "carbos": "Carbon",
}, },
EvolutionItem: { EvolutionItem: {
"NONE": "None", "NONE": "Keins",
"LINKING_CORD": "Linking Cord", "LINKING_CORD": "Linkkabel",
"SUN_STONE": "Sun Stone", "SUN_STONE": "Sonnenstein",
"MOON_STONE": "Moon Stone", "MOON_STONE": "Mondstein",
"LEAF_STONE": "Leaf Stone", "LEAF_STONE": "Blattstein",
"FIRE_STONE": "Fire Stone", "FIRE_STONE": "Feuerstein",
"WATER_STONE": "Water Stone", "WATER_STONE": "Wasserstein",
"THUNDER_STONE": "Thunder Stone", "THUNDER_STONE": "Donnerstein",
"ICE_STONE": "Ice Stone", "ICE_STONE": "Eisstein",
"DUSK_STONE": "Dusk Stone", "DUSK_STONE": "Finsterstein",
"DAWN_STONE": "Dawn Stone", "DAWN_STONE": "Funkelstein",
"SHINY_STONE": "Shiny Stone", "SHINY_STONE": "Leuchtstein",
"CRACKED_POT": "Cracked Pot", "CRACKED_POT": "Rissige Kanne",
"SWEET_APPLE": "Sweet Apple", "SWEET_APPLE": "Süßer Apfel",
"TART_APPLE": "Tart Apple", "TART_APPLE": "Saurer Apfel",
"STRAWBERRY_SWEET": "Strawberry Sweet", "STRAWBERRY_SWEET": "Zucker-Erdbeere",
"UNREMARKABLE_TEACUP": "Unremarkable Teacup", "UNREMARKABLE_TEACUP": "Simple Teeschale",
"CHIPPED_POT": "Chipped Pot", "CHIPPED_POT": "Löchrige Kanne",
"BLACK_AUGURITE": "Black Augurite", "BLACK_AUGURITE": "Schwarzaugit",
"GALARICA_CUFF": "Galarica Cuff", "GALARICA_CUFF": "Galarnuss-Reif",
"GALARICA_WREATH": "Galarica Wreath", "GALARICA_WREATH": "Galarnuss-Kranz",
"PEAT_BLOCK": "Peat Block", "PEAT_BLOCK": "Torfblock",
"AUSPICIOUS_ARMOR": "Auspicious Armor", "AUSPICIOUS_ARMOR": "Glorienrüstung",
"MALICIOUS_ARMOR": "Malicious Armor", "MALICIOUS_ARMOR": "Fluchrüstung",
"MASTERPIECE_TEACUP": "Masterpiece Teacup", "MASTERPIECE_TEACUP": "Edle Teeschale",
"METAL_ALLOY": "Metal Alloy", "METAL_ALLOY": "Legierungsmetall",
"SCROLL_OF_DARKNESS": "Scroll Of Darkness", "SCROLL_OF_DARKNESS": "Unlicht-Schriftrolle",
"SCROLL_OF_WATERS": "Scroll Of Waters", "SCROLL_OF_WATERS": "Wasser-Schriftrolle",
"SYRUPY_APPLE": "Syrupy Apple", "SYRUPY_APPLE": "Saftiger Apfel",
}, },
FormChangeItem: { FormChangeItem: {
"NONE": "None", "NONE": "Keins",
"ABOMASITE": "Abomasite", "ABOMASITE": "Rexblisarnit",
"ABSOLITE": "Absolite", "ABSOLITE": "Absolnit",
"AERODACTYLITE": "Aerodactylite", "AERODACTYLITE": "Aerodactylonit",
"AGGRONITE": "Aggronite", "AGGRONITE": "Stollossnit",
"ALAKAZITE": "Alakazite", "ALAKAZITE": "Simsalanit",
"ALTARIANITE": "Altarianite", "ALTARIANITE": "Altarianit",
"AMPHAROSITE": "Ampharosite", "AMPHAROSITE": "Ampharosnit",
"AUDINITE": "Audinite", "AUDINITE": "Ohrdochnit",
"BANETTITE": "Banettite", "BANETTITE": "Banetteonit",
"BEEDRILLITE": "Beedrillite", "BEEDRILLITE": "Bibornit",
"BLASTOISINITE": "Blastoisinite", "BLASTOISINITE": "Turtoknit",
"BLAZIKENITE": "Blazikenite", "BLAZIKENITE": "Lohgocknit",
"CAMERUPTITE": "Cameruptite", "CAMERUPTITE": "Cameruptnit",
"CHARIZARDITE_X": "Charizardite X", "CHARIZARDITE_X": "Gluraknit X",
"CHARIZARDITE_Y": "Charizardite Y", "CHARIZARDITE_Y": "Gluraknit Y",
"DIANCITE": "Diancite", "DIANCITE": "Diancienit",
"GALLADITE": "Galladite", "GALLADITE": "Galagladinit",
"GARCHOMPITE": "Garchompite", "GARCHOMPITE": "Knakracknit",
"GARDEVOIRITE": "Gardevoirite", "GARDEVOIRITE": "Guardevoirnit",
"GENGARITE": "Gengarite", "GENGARITE": "Gengarnit ",
"GLALITITE": "Glalitite", "GLALITITE": "Firnontornit",
"GYARADOSITE": "Gyaradosite", "GYARADOSITE": "Garadosnit",
"HERACRONITE": "Heracronite", "HERACRONITE": "Skarabornit",
"HOUNDOOMINITE": "Houndoominite", "HOUNDOOMINITE": "Hundemonit ",
"KANGASKHANITE": "Kangaskhanite", "KANGASKHANITE": "Kangamanit",
"LATIASITE": "Latiasite", "LATIASITE": "Latiasnit",
"LATIOSITE": "Latiosite", "LATIOSITE": "Latiosnit",
"LOPUNNITE": "Lopunnite", "LOPUNNITE": "Schlapornit",
"LUCARIONITE": "Lucarionite", "LUCARIONITE": "Lucarionit",
"MANECTITE": "Manectite", "MANECTITE": "Voltensonit",
"MAWILITE": "Mawilite", "MAWILITE": "Flunkifernit",
"MEDICHAMITE": "Medichamite", "MEDICHAMITE": "Meditalisnit",
"METAGROSSITE": "Metagrossite", "METAGROSSITE": "Metagrossnit",
"MEWTWONITE_X": "Mewtwonite X", "MEWTWONITE_X": "Mewtunit X",
"MEWTWONITE_Y": "Mewtwonite Y", "MEWTWONITE_Y": "Mewtunit Y",
"PIDGEOTITE": "Pidgeotite", "PIDGEOTITE": "Taubossnit",
"PINSIRITE": "Pinsirite", "PINSIRITE": "Pinsirnit",
"RAYQUAZITE": "Rayquazite", "RAYQUAZITE": "Rayquazanit",
"SABLENITE": "Sablenite", "SABLENITE": "Zobirisnit",
"SALAMENCITE": "Salamencite", "SALAMENCITE": "Brutalandanit",
"SCEPTILITE": "Sceptilite", "SCEPTILITE": "Gewaldronit",
"SCIZORITE": "Scizorite", "SCIZORITE": "Scheroxnit",
"SHARPEDONITE": "Sharpedonite", "SHARPEDONITE": "Tohaidonit",
"SLOWBRONITE": "Slowbronite", "SLOWBRONITE": "Lahmusnit",
"STEELIXITE": "Steelixite", "STEELIXITE": "Stahlosnit",
"SWAMPERTITE": "Swampertite", "SWAMPERTITE": "Sumpexnit",
"TYRANITARITE": "Tyranitarite", "TYRANITARITE": "Despotarnit",
"VENUSAURITE": "Venusaurite", "VENUSAURITE": "Bisaflornit",
"BLUE_ORB": "Blue Orb", "BLUE_ORB": "Blauer Edelstein",
"RED_ORB": "Red Orb", "RED_ORB": "Roter Edelstein",
"SHARP_METEORITE": "Sharp Meteorite", "SHARP_METEORITE": "Scharfer Meteorit",
"HARD_METEORITE": "Hard Meteorite", "HARD_METEORITE": "Harter Meteorit",
"SMOOTH_METEORITE": "Smooth Meteorite", "SMOOTH_METEORITE": "Glatter Meteorit",
"ADAMANT_CRYSTAL": "Adamant Crystal", "ADAMANT_CRYSTAL": "Adamantkristall",
"LUSTROUS_ORB": "Lustrous Orb", "LUSTROUS_ORB": "Weiß-Orb",
"GRISEOUS_CORE": "Griseous Core", "GRISEOUS_CORE": "Platinumkristall",
"REVEAL_GLASS": "Reveal Glass", "REVEAL_GLASS": "Wahrspiegel",
"GRACIDEA": "Gracidea", "GRACIDEA": "Gracidea",
"MAX_MUSHROOMS": "Max Mushrooms", "MAX_MUSHROOMS": "Dyna-Pilz",
"DARK_STONE": "Dark Stone", "DARK_STONE": "Dunkelstein",
"LIGHT_STONE": "Light Stone", "LIGHT_STONE": "Lichtstein",
"PRISON_BOTTLE": "Prison Bottle", "PRISON_BOTTLE": "Banngefäß",
"N_LUNARIZER": "N Lunarizer", "N_LUNARIZER": "Necrolun",
"N_SOLARIZER": "N Solarizer", "N_SOLARIZER": "Necrosol",
"RUSTED_SWORD": "Rusted Sword", "RUSTED_SWORD": "Rostiges Schwert",
"RUSTED_SHIELD": "Rusted Shield", "RUSTED_SHIELD": "Rostiges Schild",
"ICY_REINS_OF_UNITY": "Icy Reins Of Unity", "ICY_REINS_OF_UNITY": "eisige Zügel des Bundes",
"SHADOW_REINS_OF_UNITY": "Shadow Reins Of Unity", "SHADOW_REINS_OF_UNITY": "schattige Zügel des Bundes",
"WELLSPRING_MASK": "Wellspring Mask", "WELLSPRING_MASK": "Brunnenmaske",
"HEARTHFLAME_MASK": "Hearthflame Mask", "HEARTHFLAME_MASK": "Ofenmaske",
"CORNERSTONE_MASK": "Cornerstone Mask", "CORNERSTONE_MASK": "Fundamentmaske",
"SHOCK_DRIVE": "Shock Drive", "SHOCK_DRIVE": "Blitzmodul",
"BURN_DRIVE": "Burn Drive", "BURN_DRIVE": "Flammenmodul",
"CHILL_DRIVE": "Chill Drive", "CHILL_DRIVE": "Gefriermodul",
"DOUSE_DRIVE": "Douse Drive", "DOUSE_DRIVE": "Aquamodul",
}, },
TeraType: { TeraType: {
"UNKNOWN": "Unknown", "UNKNOWN": "Unbekannt",
"NORMAL": "Normal", "NORMAL": "Normal",
"FIGHTING": "Fighting", "FIGHTING": "Kampf",
"FLYING": "Flying", "FLYING": "Flug",
"POISON": "Poison", "POISON": "Gift",
"GROUND": "Ground", "GROUND": "Boden",
"ROCK": "Rock", "ROCK": "Gestein",
"BUG": "Bug", "BUG": "Käfer",
"GHOST": "Ghost", "GHOST": "Geist",
"STEEL": "Steel", "STEEL": "Stahl",
"FIRE": "Fire", "FIRE": "Feuer",
"WATER": "Water", "WATER": "Wasser",
"GRASS": "Grass", "GRASS": "Pflanze",
"ELECTRIC": "Electric", "ELECTRIC": "Elektro",
"PSYCHIC": "Psychic", "PSYCHIC": "Psycho",
"ICE": "Ice", "ICE": "Eis",
"DRAGON": "Dragon", "DRAGON": "Drache",
"DARK": "Dark", "DARK": "Unlicht",
"FAIRY": "Fairy", "FAIRY": "Fee",
"STELLAR": "Stellar", "STELLAR": "Stellar",
}, },
} as const; } as const;

View File

@ -0,0 +1,37 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const splashMessages: SimpleTranslationEntries = {
"battlesWon": "Battles Won!",
"joinTheDiscord": "Join the Discord!",
"infiniteLevels": "Infinite Levels!",
"everythingStacks": "Everything Stacks!",
"optionalSaveScumming": "Optional Save Scumming!",
"biomes": "35 Biomes!",
"openSource": "Open Source!",
"playWithSpeed": "Play with 5x Speed!",
"liveBugTesting": "Live Bug Testing!",
"heavyInfluence": "Heavy RoR2 Influence!",
"pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!",
"nowWithMoreSalt": "Now with 33% More Salt!",
"infiniteFusionAtHome": "Infinite Fusion at Home!",
"brokenEggMoves": "Broken Egg Moves!",
"magnificent": "Magnificent!",
"mubstitute": "Mubstitute!",
"thatsCrazy": "That\'s Crazy!",
"oranceJuice": "Orance Juice!",
"questionableBalancing": "Questionable Balancing!",
"coolShaders": "Cool Shaders!",
"aiFree": "AI-Free!",
"suddenDifficultySpikes": "Sudden Difficulty Spikes!",
"basedOnAnUnfinishedFlashGame": "Based on an Unfinished Flash Game!",
"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!",
"alsoTryPokengine": "Also Try Pokéngine!",
"alsoTryEmeraldRogue": "Also Try Emerald Rogue!",
"alsoTryRadicalRed": "Also Try Radical Red!",
"eeveeExpo": "Eevee Expo!",
"ynoproject": "YNOproject!",
} as const;

View File

@ -17,7 +17,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"gen8": "VIII", "gen8": "VIII",
"gen9": "IX", "gen9": "IX",
"growthRate": "Wachstum:", "growthRate": "Wachstum:",
"ability": "Fhgkeit:", "ability": "Fähgkeit:",
"passive": "Passiv:", "passive": "Passiv:",
"nature": "Wesen:", "nature": "Wesen:",
"eggMoves": "Ei-Attacken", "eggMoves": "Ei-Attacken",
@ -40,5 +40,5 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"disablePassive": "Passiv-Skill deaktivieren", "disablePassive": "Passiv-Skill deaktivieren",
"locked": "Gesperrt", "locked": "Gesperrt",
"disabled": "Deaktiviert", "disabled": "Deaktiviert",
"uncaught": "Uncaught" "uncaught": "Ungefangen"
} }

View File

@ -4,41 +4,41 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
* The weather namespace holds text displayed when weather is active during a battle * The weather namespace holds text displayed when weather is active during a battle
*/ */
export const weather: SimpleTranslationEntries = { export const weather: SimpleTranslationEntries = {
"sunnyStartMessage": "The sunlight got bright!", "sunnyStartMessage": "Die Sonne hellt auf!",
"sunnyLapseMessage": "The sunlight is strong.", "sunnyLapseMessage": "Die Sonne blendet.",
"sunnyClearMessage": "The sunlight faded.", "sunnyClearMessage": "Die Sonne schwächt ab.",
"rainStartMessage": "A downpour started!", "rainStartMessage": "Es fängt an zu regnen!",
"rainLapseMessage": "The downpour continues.", "rainLapseMessage": "Es regnet weiterhin.",
"rainClearMessage": "The rain stopped.", "rainClearMessage": "Es hört auf zu regnen.",
"sandstormStartMessage": "A sandstorm brewed!", "sandstormStartMessage": "Ein Sandsturm braut sich zusammen!",
"sandstormLapseMessage": "The sandstorm rages.", "sandstormLapseMessage": "Der Sandsturm tobt.",
"sandstormClearMessage": "The sandstorm subsided.", "sandstormClearMessage": "Der Sandsturm lässt nach.",
"sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!", "sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} ist vom\nSandsturm beeinträchtigt!",
"hailStartMessage": "It started to hail!", "hailStartMessage": "Es fängt an zu hageln!",
"hailLapseMessage": "Hail continues to fall.", "hailLapseMessage": "Es hagelt weiterhin.",
"hailClearMessage": "The hail stopped.", "hailClearMessage": "Es hört auf zu hageln.",
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!", "hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} ist vom\nHagel beeinträchtigt!",
"snowStartMessage": "It started to snow!", "snowStartMessage": "Es fängt an zu schneien!",
"snowLapseMessage": "The snow is falling down.", "snowLapseMessage": "Es schneit weiterhin.",
"snowClearMessage": "The snow stopped.", "snowClearMessage": "Es hört auf zu schneien.",
"fogStartMessage": "A thick fog emerged!", "fogStartMessage": "Es fängt an zu nebeln!",
"fogLapseMessage": "The fog continues.", "fogLapseMessage": "Es nebelt weiterhin.",
"fogClearMessage": "The fog disappeared.", "fogClearMessage": "Es hört auf zu nebeln.",
"heavyRainStartMessage": "A heavy downpour started!", "heavyRainStartMessage": "Ein Starkregen beginnt!",
"heavyRainLapseMessage": "The heavy downpour continues.", "heavyRainLapseMessage": "Der Starkregen hält an.",
"heavyRainClearMessage": "The heavy rain stopped.", "heavyRainClearMessage": "Der Starkregen lässt nach.",
"harshSunStartMessage": "The sunlight got hot!", "harshSunStartMessage": "Das Sonnenlicht wird wärmer!",
"harshSunLapseMessage": "The sun is scorching hot.", "harshSunLapseMessage": "Das Sonnenlicht brennt.",
"harshSunClearMessage": "The harsh sunlight faded.", "harshSunClearMessage": "Das Sonnenlicht schwächt ab.",
"strongWindsStartMessage": "A heavy wind began!", "strongWindsStartMessage": "Ein starker Wind zieht auf!",
"strongWindsLapseMessage": "The wind blows intensely.", "strongWindsLapseMessage": "Der starke Wind tobt.",
"strongWindsClearMessage": "The heavy wind stopped." "strongWindsClearMessage": "Der starke Wind legt sich."
} }

View File

@ -2,6 +2,7 @@ import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger"; import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { egg } from "./egg";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
import { growth } from "./growth"; import { growth } from "./growth";
import { menu } from "./menu"; import { menu } from "./menu";
@ -14,6 +15,7 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { splashMessages } from "./splash-messages"
import { weather } from "./weather"; import { weather } from "./weather";
@ -22,6 +24,7 @@ export const enConfig = {
abilityTriggers: abilityTriggers, abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
egg: egg,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
menuUiHandler: menuUiHandler, menuUiHandler: menuUiHandler,
menu: menu, menu: menu,
@ -31,6 +34,7 @@ export const enConfig = {
pokemon: pokemon, pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
splashMessages: splashMessages,
nature: nature, nature: nature,
growth: growth, growth: growth,
weather: weather, weather: weather,

21
src/locales/en/egg.ts Normal file
View File

@ -0,0 +1,21 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const egg: SimpleTranslationEntries = {
"egg": "Egg",
"greatTier": "Rare",
"ultraTier": "Epic",
"masterTier": "Legendary",
"defaultTier": "Common",
"hatchWavesMessageSoon": "Sounds can be heard coming from inside! It will hatch soon!",
"hatchWavesMessageClose": "It appears to move occasionally. It may be close to hatching.",
"hatchWavesMessageNotClose": "What will hatch from this? It doesn't seem close to hatching.",
"hatchWavesMessageLongTime": "It looks like this Egg will take a long time to hatch.",
"gachaTypeLegendary": "Legendary Rate Up",
"gachaTypeMove": "Rare Egg Move Rate Up",
"gachaTypeShiny": "Shiny Rate Up",
"selectMachine": "Select a machine.",
"notEnoughVouchers": "You don't have enough vouchers!",
"tooManyEggs": "You have too many eggs!",
"pull": "Pull",
"pulls": "Pulls"
} as const;

View File

@ -0,0 +1,37 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const splashMessages: SimpleTranslationEntries = {
"battlesWon": "Battles Won!",
"joinTheDiscord": "Join the Discord!",
"infiniteLevels": "Infinite Levels!",
"everythingStacks": "Everything Stacks!",
"optionalSaveScumming": "Optional Save Scumming!",
"biomes": "35 Biomes!",
"openSource": "Open Source!",
"playWithSpeed": "Play with 5x Speed!",
"liveBugTesting": "Live Bug Testing!",
"heavyInfluence": "Heavy RoR2 Influence!",
"pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!",
"nowWithMoreSalt": "Now with 33% More Salt!",
"infiniteFusionAtHome": "Infinite Fusion at Home!",
"brokenEggMoves": "Broken Egg Moves!",
"magnificent": "Magnificent!",
"mubstitute": "Mubstitute!",
"thatsCrazy": "That\'s Crazy!",
"oranceJuice": "Orance Juice!",
"questionableBalancing": "Questionable Balancing!",
"coolShaders": "Cool Shaders!",
"aiFree": "AI-Free!",
"suddenDifficultySpikes": "Sudden Difficulty Spikes!",
"basedOnAnUnfinishedFlashGame": "Based on an Unfinished Flash Game!",
"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!",
"alsoTryPokengine": "Also Try Pokéngine!",
"alsoTryEmeraldRogue": "Also Try Emerald Rogue!",
"alsoTryRadicalRed": "Also Try Radical Red!",
"eeveeExpo": "Eevee Expo!",
"ynoproject": "YNOproject!",
} as const;

View File

@ -14,11 +14,11 @@ export const battle: SimpleTranslationEntries = {
"pokemonCaught": "¡{{pokemonName}} atrapado!", "pokemonCaught": "¡{{pokemonName}} atrapado!",
"pokemon": "Pokémon", "pokemon": "Pokémon",
"sendOutPokemon": "¡Adelante, {{pokemonName}}!", "sendOutPokemon": "¡Adelante, {{pokemonName}}!",
"hitResultCriticalHit": "A critical hit!", "hitResultCriticalHit": "!Un golpe crítico!",
"hitResultSuperEffective": "It's super effective!", "hitResultSuperEffective": "!Es supereficaz!",
"hitResultNotVeryEffective": "It's not very effective…", "hitResultNotVeryEffective": "No es muy eficaz…",
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!", "hitResultNoEffect": "No afecta a {{pokemonName}}!",
"hitResultOneHitKO": "It's a one-hit KO!", "hitResultOneHitKO": "!KO en 1 golpe!",
"attackFailed": "¡Pero ha fallado!", "attackFailed": "¡Pero ha fallado!",
"attackHitsCount": `N.º de golpes: {{count}}.`, "attackHitsCount": `N.º de golpes: {{count}}.`,
"expGain": "{{pokemonName}} ha ganado\n{{exp}} puntos de experiencia.", "expGain": "{{pokemonName}} ha ganado\n{{exp}} puntos de experiencia.",

View File

@ -2,6 +2,7 @@ import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger"; import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { egg } from "./egg";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
import { growth } from "./growth"; import { growth } from "./growth";
import { menu } from "./menu"; import { menu } from "./menu";
@ -14,6 +15,7 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { splashMessages } from "./splash-messages"
import { weather } from "./weather"; import { weather } from "./weather";
@ -22,6 +24,7 @@ export const esConfig = {
abilityTriggers: abilityTriggers, abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
egg: egg,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
menuUiHandler: menuUiHandler, menuUiHandler: menuUiHandler,
menu: menu, menu: menu,
@ -31,6 +34,7 @@ export const esConfig = {
pokemon: pokemon, pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
splashMessages: splashMessages,
nature: nature, nature: nature,
growth: growth, growth: growth,
weather: weather, weather: weather,

21
src/locales/es/egg.ts Normal file
View File

@ -0,0 +1,21 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const egg: SimpleTranslationEntries = {
"egg": "Egg",
"greatTier": "Rare",
"ultraTier": "Epic",
"masterTier": "Legendary",
"defaultTier": "Common",
"hatchWavesMessageSoon": "Sounds can be heard coming from inside! It will hatch soon!",
"hatchWavesMessageClose": "It appears to move occasionally. It may be close to hatching.",
"hatchWavesMessageNotClose": "What will hatch from this? It doesn't seem close to hatching.",
"hatchWavesMessageLongTime": "It looks like this Egg will take a long time to hatch.",
"gachaTypeLegendary": "Legendary Rate Up",
"gachaTypeMove": "Rare Egg Move Rate Up",
"gachaTypeShiny": "Shiny Rate Up",
"selectMachine": "Select a machine.",
"notEnoughVouchers": "You don't have enough vouchers!",
"tooManyEggs": "You have too many eggs!",
"pull": "Pull",
"pulls": "Pulls"
} as const;

View File

@ -3,5 +3,5 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = { export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP", "pp": "PP",
"power": "Potencia", "power": "Potencia",
"accuracy": "Accuracy", "accuracy": "Precisión",
} as const; } as const;

View File

@ -0,0 +1,37 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const splashMessages: SimpleTranslationEntries = {
"battlesWon": "Battles Won!",
"joinTheDiscord": "Join the Discord!",
"infiniteLevels": "Infinite Levels!",
"everythingStacks": "Everything Stacks!",
"optionalSaveScumming": "Optional Save Scumming!",
"biomes": "35 Biomes!",
"openSource": "Open Source!",
"playWithSpeed": "Play with 5x Speed!",
"liveBugTesting": "Live Bug Testing!",
"heavyInfluence": "Heavy RoR2 Influence!",
"pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!",
"nowWithMoreSalt": "Now with 33% More Salt!",
"infiniteFusionAtHome": "Infinite Fusion at Home!",
"brokenEggMoves": "Broken Egg Moves!",
"magnificent": "Magnificent!",
"mubstitute": "Mubstitute!",
"thatsCrazy": "That\'s Crazy!",
"oranceJuice": "Orance Juice!",
"questionableBalancing": "Questionable Balancing!",
"coolShaders": "Cool Shaders!",
"aiFree": "AI-Free!",
"suddenDifficultySpikes": "Sudden Difficulty Spikes!",
"basedOnAnUnfinishedFlashGame": "Based on an Unfinished Flash Game!",
"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!",
"alsoTryPokengine": "Also Try Pokéngine!",
"alsoTryEmeraldRogue": "Also Try Emerald Rogue!",
"alsoTryRadicalRed": "Also Try Radical Red!",
"eeveeExpo": "Eevee Expo!",
"ynoproject": "YNOproject!",
} as const;

View File

@ -2,6 +2,7 @@ import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger"; import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { egg } from "./egg";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
import { growth } from "./growth"; import { growth } from "./growth";
import { menu } from "./menu"; import { menu } from "./menu";
@ -14,6 +15,7 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { splashMessages } from "./splash-messages"
import { weather } from "./weather"; import { weather } from "./weather";
@ -22,6 +24,7 @@ export const frConfig = {
abilityTriggers: abilityTriggers, abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
egg: egg,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
menuUiHandler: menuUiHandler, menuUiHandler: menuUiHandler,
menu: menu, menu: menu,
@ -31,6 +34,7 @@ export const frConfig = {
pokemon: pokemon, pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
splashMessages: splashMessages,
nature: nature, nature: nature,
growth: growth, growth: growth,
weather: weather, weather: weather,

21
src/locales/fr/egg.ts Normal file
View File

@ -0,0 +1,21 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const egg: SimpleTranslationEntries = {
"egg": "Œuf",
"greatTier": "Rare",
"ultraTier": "Épique",
"masterTier": "Légendaire",
"defaultTier": "Commun",
"hatchWavesMessageSoon": "Il fait du bruit. Il va éclore !",
"hatchWavesMessageClose": "Il bouge de temps en temps. Il devrait bientôt éclore.",
"hatchWavesMessageNotClose": "Quest-ce qui va en sortir ? Ça va mettre du temps.",
"hatchWavesMessageLongTime": "Cet Œuf va sûrement mettre du temps à éclore.",
"gachaTypeLegendary": "Taux de Légendaires élevé",
"gachaTypeMove": "Taux de Capacité Œuf Rare élevé",
"gachaTypeShiny": "Taux de Chromatiques élevé",
"selectMachine": "Sélectionnez une machine.",
"notEnoughVouchers": "Vous navez pas assez de coupons !",
"tooManyEggs": "Vous avez trop dŒufs !",
"pull": "Tirage",
"pulls": "Tirages"
} as const;

View File

@ -0,0 +1,37 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const splashMessages: SimpleTranslationEntries = {
"battlesWon": "Battles Won!",
"joinTheDiscord": "Join the Discord!",
"infiniteLevels": "Infinite Levels!",
"everythingStacks": "Everything Stacks!",
"optionalSaveScumming": "Optional Save Scumming!",
"biomes": "35 Biomes!",
"openSource": "Open Source!",
"playWithSpeed": "Play with 5x Speed!",
"liveBugTesting": "Live Bug Testing!",
"heavyInfluence": "Heavy RoR2 Influence!",
"pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!",
"nowWithMoreSalt": "Now with 33% More Salt!",
"infiniteFusionAtHome": "Infinite Fusion at Home!",
"brokenEggMoves": "Broken Egg Moves!",
"magnificent": "Magnificent!",
"mubstitute": "Mubstitute!",
"thatsCrazy": "That\'s Crazy!",
"oranceJuice": "Orance Juice!",
"questionableBalancing": "Questionable Balancing!",
"coolShaders": "Cool Shaders!",
"aiFree": "AI-Free!",
"suddenDifficultySpikes": "Sudden Difficulty Spikes!",
"basedOnAnUnfinishedFlashGame": "Based on an Unfinished Flash Game!",
"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!",
"alsoTryPokengine": "Also Try Pokéngine!",
"alsoTryEmeraldRogue": "Also Try Emerald Rogue!",
"alsoTryRadicalRed": "Also Try Radical Red!",
"eeveeExpo": "Eevee Expo!",
"ynoproject": "YNOproject!",
} as const;

View File

@ -2,6 +2,7 @@ import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger"; import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { egg } from "./egg";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
import { growth } from "./growth"; import { growth } from "./growth";
import { menu } from "./menu"; import { menu } from "./menu";
@ -14,6 +15,7 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { splashMessages } from "./splash-messages"
import { weather } from "./weather"; import { weather } from "./weather";
@ -22,6 +24,7 @@ export const itConfig = {
abilityTriggers: abilityTriggers, abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
egg: egg,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
menuUiHandler: menuUiHandler, menuUiHandler: menuUiHandler,
menu: menu, menu: menu,
@ -31,6 +34,7 @@ export const itConfig = {
pokemon: pokemon, pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
splashMessages: splashMessages,
nature: nature, nature: nature,
growth: growth, growth: growth,
weather: weather, weather: weather,

21
src/locales/it/egg.ts Normal file
View File

@ -0,0 +1,21 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const egg: SimpleTranslationEntries = {
"egg": "Egg",
"greatTier": "Rare",
"ultraTier": "Epic",
"masterTier": "Legendary",
"defaultTier": "Common",
"hatchWavesMessageSoon": "Sounds can be heard coming from inside! It will hatch soon!",
"hatchWavesMessageClose": "It appears to move occasionally. It may be close to hatching.",
"hatchWavesMessageNotClose": "What will hatch from this? It doesn't seem close to hatching.",
"hatchWavesMessageLongTime": "It looks like this Egg will take a long time to hatch.",
"gachaTypeLegendary": "Legendary Rate Up",
"gachaTypeMove": "Rare Egg Move Rate Up",
"gachaTypeShiny": "Shiny Rate Up",
"selectMachine": "Select a machine.",
"notEnoughVouchers": "You don't have enough vouchers!",
"tooManyEggs": "You have too many eggs!",
"pull": "Pull",
"pulls": "Pulls"
} as const;

View File

@ -0,0 +1,37 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const splashMessages: SimpleTranslationEntries = {
"battlesWon": "Battaglie Vinte!",
"joinTheDiscord": "Entra nel Discord!",
"infiniteLevels": "Livelli Infiniti!",
"everythingStacks": "Tutto si impila!",
"optionalSaveScumming": "Salvataggio Facoltativo!",
"biomes": "35 Biomi!",
"openSource": "Open Source!",
"playWithSpeed": "Gioca con il 5x di Velocità!",
"liveBugTesting": "Test dei Bug in Tempo Reale!",
"heavyInfluence": "Influenzato da RoR2!",
"pokemonRiskAndPokemonRain": "Pokémon Risk e Pokémon Rain!",
"nowWithMoreSalt": "Adesso con il 33% di sale in più!",
"infiniteFusionAtHome": "Fusioni Infinite a Casa!",
"brokenEggMoves": "Mosse delle Uova Rotte!",
"magnificent": "Magnifico!",
"mubstitute": "Mubstitute!",
"thatsCrazy": "È Pazzesco!",
"oranceJuice": "Succo d\'Arancia!",
"questionableBalancing": "Bilanciamento Discutibile!",
"coolShaders": "Shader fantastici!",
"aiFree": "Senza Intelligenza Artificiale!",
"suddenDifficultySpikes": "Picchi di Difficoltà Improvvisi!",
"basedOnAnUnfinishedFlashGame": "Basato su un Gioco Flash Incompiuto!",
"moreAddictiveThanIntended": "Crea Dipendeza più del Dovuto!",
"mostlyConsistentSeeds": "Seeds Consistenti!",
"achievementPointsDontDoAnything": "I Punti Obiettivo non Fanno Nulla!",
"youDoNotStartAtLevel": "Non Cominci dal Livello 2000!",
"dontTalkAboutTheManaphyEggIncident": "Non Parlare dell'Incidente dell'Uovo di Manaphy!",
"alsoTryPokengine": "Prova anche Pokéngine!",
"alsoTryEmeraldRogue": "Prova anche Emerald Rogue!",
"alsoTryRadicalRed": "Prova anche Radical Red!",
"eeveeExpo": "Eevee Expo!",
"ynoproject": "YNOproject!",
} as const;

View File

@ -1101,7 +1101,7 @@ export const modifierTypes = {
MEMORY_MUSHROOM: () => new RememberMoveModifierType(`modifierType:ModifierType.MEMORY_MUSHROOM`, 'big_mushroom'), MEMORY_MUSHROOM: () => new RememberMoveModifierType(`modifierType:ModifierType.MEMORY_MUSHROOM`, 'big_mushroom'),
EXP_SHARE: () => new ModifierType(`modifierType:ModifierType.EXP_SHARE`, 'exp_share', (type, _args) => new Modifiers.ExpShareModifier(type), 'exp_share'), EXP_SHARE: () => new ModifierType(`modifierType:ModifierType.EXP_SHARE`, 'exp_share', (type, _args) => new Modifiers.ExpShareModifier(type)),
EXP_BALANCE: () => new ModifierType(`modifierType:ModifierType.EXP_BALANCE`, 'exp_balance', (type, _args) => new Modifiers.ExpBalanceModifier(type)), EXP_BALANCE: () => new ModifierType(`modifierType:ModifierType.EXP_BALANCE`, 'exp_balance', (type, _args) => new Modifiers.ExpBalanceModifier(type)),
OVAL_CHARM: () => new ModifierType(`modifierType:ModifierType.OVAL_CHARM`, 'oval_charm', (type, _args) => new Modifiers.MultipleParticipantExpBonusModifier(type)), OVAL_CHARM: () => new ModifierType(`modifierType:ModifierType.OVAL_CHARM`, 'oval_charm', (type, _args) => new Modifiers.MultipleParticipantExpBonusModifier(type)),

View File

@ -2270,12 +2270,8 @@ export class MovePhase extends BattlePhase {
} }
const targets = this.scene.getField(true).filter(p => { const targets = this.scene.getField(true).filter(p => {
if (this.targets.indexOf(p.getBattlerIndex()) > -1) { if (this.targets.indexOf(p.getBattlerIndex()) > -1)
const hiddenTag = p.getTag(HiddenTag);
if (hiddenTag && !this.move.getMove().getAttrs(HitsTagAttr).filter(hta => (hta as HitsTagAttr).tagType === hiddenTag.tagType).length && !p.hasAbilityWithAttr(AlwaysHitAbAttr) && !this.pokemon.hasAbilityWithAttr(AlwaysHitAbAttr))
return false;
return true; return true;
}
return false; return false;
}); });
@ -2316,10 +2312,17 @@ export class MovePhase extends BattlePhase {
if (this.move.moveId) if (this.move.moveId)
this.showMoveText(); this.showMoveText();
if ((moveQueue.length && moveQueue[0].move === Moves.NONE) || (!targets.length && !this.move.getMove().getAttrs(SacrificialAttr).length)) { // This should only happen when there are no valid targets left on the field
moveQueue.shift(); if ((moveQueue.length && moveQueue[0].move === Moves.NONE) || !targets.length) {
this.showFailedText();
this.cancel(); this.cancel();
// Record a failed move so Abilities like Truant don't trigger next turn and soft-lock
this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL });
this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); // Remove any tags from moves like Fly/Dive/etc.
moveQueue.shift();
return this.end(); return this.end();
} }
@ -2590,13 +2593,14 @@ export class MoveEffectPhase extends PokemonPhase {
if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr))
return true; return true;
// If the user should ignore accuracy on a target, check who the user targeted last turn and see if they match
if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().slice(1).find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1)
return true;
const hiddenTag = target.getTag(HiddenTag); const hiddenTag = target.getTag(HiddenTag);
if (hiddenTag && !this.move.getMove().getAttrs(HitsTagAttr).filter(hta => (hta as HitsTagAttr).tagType === hiddenTag.tagType).length) if (hiddenTag && !this.move.getMove().getAttrs(HitsTagAttr).filter(hta => (hta as HitsTagAttr).tagType === hiddenTag.tagType).length)
return false; return false;
if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) > -1)
return true;
const moveAccuracy = new Utils.NumberHolder(this.move.getMove().accuracy); const moveAccuracy = new Utils.NumberHolder(this.move.getMove().accuracy);
applyMoveAttrs(VariableAccuracyAttr, user, target, this.move.getMove(), moveAccuracy); applyMoveAttrs(VariableAccuracyAttr, user, target, this.move.getMove(), moveAccuracy);

View File

@ -124,8 +124,10 @@ declare module 'i18next' {
fightUiHandler: SimpleTranslationEntries; fightUiHandler: SimpleTranslationEntries;
tutorial: SimpleTranslationEntries; tutorial: SimpleTranslationEntries;
starterSelectUiHandler: SimpleTranslationEntries; starterSelectUiHandler: SimpleTranslationEntries;
splashMessages: SimpleTranslationEntries;
nature: SimpleTranslationEntries; nature: SimpleTranslationEntries;
growth: SimpleTranslationEntries; growth: SimpleTranslationEntries;
egg: SimpleTranslationEntries;
weather: SimpleTranslationEntries; weather: SimpleTranslationEntries;
modifierType: ModifierTypeTranslationEntries; modifierType: ModifierTypeTranslationEntries;
}; };

View File

@ -10,8 +10,7 @@ import { addWindow } from "./ui-theme";
import { Tutorial, handleTutorial } from "../tutorial"; import { Tutorial, handleTutorial } from "../tutorial";
import { EggTier } from "../data/enums/egg-type"; import { EggTier } from "../data/enums/egg-type";
import {Button} from "../enums/buttons"; import {Button} from "../enums/buttons";
import i18next from '../plugins/i18n';
const defaultText = 'Select a machine.';
export default class EggGachaUiHandler extends MessageUiHandler { export default class EggGachaUiHandler extends MessageUiHandler {
private eggGachaContainer: Phaser.GameObjects.Container; private eggGachaContainer: Phaser.GameObjects.Container;
@ -33,6 +32,7 @@ export default class EggGachaUiHandler extends MessageUiHandler {
private cursorObj: Phaser.GameObjects.Image; private cursorObj: Phaser.GameObjects.Image;
private transitioning: boolean; private transitioning: boolean;
private transitionCancelled: boolean; private transitionCancelled: boolean;
private defaultText: string;
constructor(scene: BattleScene) { constructor(scene: BattleScene) {
super(scene, Mode.EGG_GACHA); super(scene, Mode.EGG_GACHA);
@ -43,6 +43,7 @@ export default class EggGachaUiHandler extends MessageUiHandler {
this.gachaInfoContainers = []; this.gachaInfoContainers = [];
this.voucherCountLabels = []; this.voucherCountLabels = [];
this.defaultText = i18next.t('egg:selectMachine');
} }
setup() { setup() {
@ -151,8 +152,27 @@ export default class EggGachaUiHandler extends MessageUiHandler {
this.eggGachaOptionSelectBg.setOrigin(1, 1); this.eggGachaOptionSelectBg.setOrigin(1, 1);
this.eggGachaOptionsContainer.add(this.eggGachaOptionSelectBg); this.eggGachaOptionsContainer.add(this.eggGachaOptionSelectBg);
const optionText = addTextObject(this.scene, 0, 0, ' x1 1 Pull\n x10 10 Pulls\n x1 5 Pulls\n x1 10 Pulls\n x1 25 Pulls\nCancel', TextStyle.WINDOW); const pullOptions = [
optionText.setLineSpacing(12); { multiplier: 'x1', description: `1 ${i18next.t('egg:pull')}` },
{ multiplier: 'x10', description: `10 ${i18next.t('egg:pulls')}` },
{ multiplier: 'x1', description: `5 ${i18next.t('egg:pulls')}` },
{ multiplier: 'x1', description: `10 ${i18next.t('egg:pulls')}` },
{ multiplier: 'x1', description: `25 ${i18next.t('egg:pulls')}` }
];
const pullOptionsText = pullOptions.map(option => ` ${option.multiplier.padEnd(4)} ${option.description}`).join('\n');
const optionText = addTextObject(
this.scene,
0,
0,
`${pullOptionsText}\n${i18next.t('menu:cancel')}`,
TextStyle.WINDOW,
);
optionText.setLineSpacing(28);
optionText.setFontSize('80px');
this.eggGachaOptionsContainer.add(optionText); this.eggGachaOptionsContainer.add(optionText);
optionText.setPositionRelative(this.eggGachaOptionSelectBg, 16, 9); optionText.setPositionRelative(this.eggGachaOptionSelectBg, 16, 9);
@ -223,7 +243,7 @@ export default class EggGachaUiHandler extends MessageUiHandler {
show(args: any[]): boolean { show(args: any[]): boolean {
super.show(args); super.show(args);
this.getUi().showText(defaultText, 0); this.getUi().showText(this.defaultText, 0);
this.setGachaCursor(1); this.setGachaCursor(1);
@ -474,7 +494,7 @@ export default class EggGachaUiHandler extends MessageUiHandler {
showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number): void { showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number): void {
if (!text) if (!text)
text = defaultText; text = this.defaultText;
if (text?.indexOf('\n') === -1) { if (text?.indexOf('\n') === -1) {
this.eggGachaMessageBox.setSize(320, 32); this.eggGachaMessageBox.setSize(320, 32);
@ -490,7 +510,7 @@ export default class EggGachaUiHandler extends MessageUiHandler {
} }
showError(text: string): void { showError(text: string): void {
this.showText(text, null, () => this.showText(defaultText), Utils.fixedInt(1500)); this.showText(text, null, () => this.showText(this.defaultText), Utils.fixedInt(1500));
} }
setTransitioning(transitioning: boolean): void { setTransitioning(transitioning: boolean): void {
@ -526,27 +546,27 @@ export default class EggGachaUiHandler extends MessageUiHandler {
case 0: case 0:
if (!this.scene.gameData.voucherCounts[VoucherType.REGULAR]) { if (!this.scene.gameData.voucherCounts[VoucherType.REGULAR]) {
error = true; error = true;
this.showError('You don\'t have enough vouchers!'); this.showError(i18next.t('egg:notEnoughVouchers'));
} else if (this.scene.gameData.eggs.length < 99) { } else if (this.scene.gameData.eggs.length < 99) {
this.consumeVouchers(VoucherType.REGULAR, 1); this.consumeVouchers(VoucherType.REGULAR, 1);
this.pull(); this.pull();
success = true; success = true;
} else { } else {
error = true; error = true;
this.showError('You have too many eggs!'); this.showError(i18next.t('egg:tooManyEggs'));
} }
break; break;
case 2: case 2:
if (!this.scene.gameData.voucherCounts[VoucherType.PLUS]) { if (!this.scene.gameData.voucherCounts[VoucherType.PLUS]) {
error = true; error = true;
this.showError('You don\'t have enough vouchers!'); this.showError(i18next.t('egg:notEnoughVouchers'));
} else if (this.scene.gameData.eggs.length < 95) { } else if (this.scene.gameData.eggs.length < 95) {
this.consumeVouchers(VoucherType.PLUS, 1); this.consumeVouchers(VoucherType.PLUS, 1);
this.pull(5); this.pull(5);
success = true; success = true;
} else { } else {
error = true; error = true;
this.showError('You have too many eggs!'); this.showError(i18next.t('egg:tooManyEggs'));
} }
break; break;
case 1: case 1:
@ -554,7 +574,7 @@ export default class EggGachaUiHandler extends MessageUiHandler {
if ((this.cursor === 1 && this.scene.gameData.voucherCounts[VoucherType.REGULAR] < 10) if ((this.cursor === 1 && this.scene.gameData.voucherCounts[VoucherType.REGULAR] < 10)
|| (this.cursor === 3 && !this.scene.gameData.voucherCounts[VoucherType.PREMIUM])) { || (this.cursor === 3 && !this.scene.gameData.voucherCounts[VoucherType.PREMIUM])) {
error = true; error = true;
this.showError('You don\'t have enough vouchers!'); this.showError(i18next.t('egg:notEnoughVouchers'));
} else if (this.scene.gameData.eggs.length < 90) { } else if (this.scene.gameData.eggs.length < 90) {
if (this.cursor === 3) if (this.cursor === 3)
this.consumeVouchers(VoucherType.PREMIUM, 1); this.consumeVouchers(VoucherType.PREMIUM, 1);
@ -564,20 +584,20 @@ export default class EggGachaUiHandler extends MessageUiHandler {
success = true; success = true;
} else { } else {
error = true; error = true;
this.showError('You have too many eggs!'); this.showError(i18next.t('egg:tooManyEggs'));
} }
break; break;
case 4: case 4:
if (!this.scene.gameData.voucherCounts[VoucherType.GOLDEN]) { if (!this.scene.gameData.voucherCounts[VoucherType.GOLDEN]) {
error = true; error = true;
this.showError('You don\'t have enough vouchers!'); this.showError(i18next.t('egg:notEnoughVouchers'));
} else if (this.scene.gameData.eggs.length < 75) { } else if (this.scene.gameData.eggs.length < 75) {
this.consumeVouchers(VoucherType.GOLDEN, 1); this.consumeVouchers(VoucherType.GOLDEN, 1);
this.pull(25); this.pull(25);
success = true; success = true;
} else { } else {
error = true; error = true;
this.showError('You have too many eggs!'); this.showError(i18next.t('egg:tooManyEggs'));
} }
break; break;
case 5: case 5:

View File

@ -7,6 +7,7 @@ import { EGG_SEED, Egg, GachaType, getEggGachaTypeDescriptor, getEggHatchWavesMe
import * as Utils from "../utils"; import * as Utils from "../utils";
import { addWindow } from "./ui-theme"; import { addWindow } from "./ui-theme";
import {Button} from "../enums/buttons"; import {Button} from "../enums/buttons";
import i18next from '../plugins/i18n';
export default class EggListUiHandler extends MessageUiHandler { export default class EggListUiHandler extends MessageUiHandler {
private eggListContainer: Phaser.GameObjects.Container; private eggListContainer: Phaser.GameObjects.Container;
@ -165,7 +166,7 @@ export default class EggListUiHandler extends MessageUiHandler {
setEggDetails(egg: Egg): void { setEggDetails(egg: Egg): void {
this.eggSprite.setFrame(`egg_${egg.getKey()}`); this.eggSprite.setFrame(`egg_${egg.getKey()}`);
this.eggNameText.setText(`Egg (${getEggDescriptor(egg)})`); this.eggNameText.setText(`${i18next.t('egg:egg')} (${getEggDescriptor(egg)})`);
this.eggDateText.setText( this.eggDateText.setText(
new Date(egg.timestamp).toLocaleString(undefined, { new Date(egg.timestamp).toLocaleString(undefined, {
weekday: 'short', weekday: 'short',

View File

@ -4,7 +4,7 @@ import OptionSelectUiHandler from "./option-select-ui-handler";
import { Mode } from "./ui"; import { Mode } from "./ui";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { TextStyle, addTextObject } from "./text"; import { TextStyle, addTextObject } from "./text";
import { battleCountSplashMessage, splashMessages } from "../data/splash-messages"; import { getBattleCountSplashMessage, getSplashMessages } from "../data/splash-messages";
import i18next from "i18next"; import i18next from "i18next";
export default class TitleUiHandler extends OptionSelectUiHandler { export default class TitleUiHandler extends OptionSelectUiHandler {
@ -63,8 +63,8 @@ export default class TitleUiHandler extends OptionSelectUiHandler {
.then(request => request.json()) .then(request => request.json())
.then(stats => { .then(stats => {
this.playerCountLabel.setText(`${stats.playerCount} ${i18next.t("menu:playersOnline")}`); this.playerCountLabel.setText(`${stats.playerCount} ${i18next.t("menu:playersOnline")}`);
if (this.splashMessage === battleCountSplashMessage) if (this.splashMessage === getBattleCountSplashMessage())
this.splashMessageText.setText(battleCountSplashMessage.replace('{COUNT}', stats.battleCount.toLocaleString('en-US'))); this.splashMessageText.setText(getBattleCountSplashMessage().replace('{COUNT}', stats.battleCount.toLocaleString('en-US')));
}) })
.catch(err => { .catch(err => {
console.error("Failed to fetch title stats:\n", err); console.error("Failed to fetch title stats:\n", err);
@ -75,7 +75,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler {
const ret = super.show(args); const ret = super.show(args);
if (ret) { if (ret) {
this.splashMessage = Utils.randItem(splashMessages); this.splashMessage = Utils.randItem(getSplashMessages());
this.splashMessageText.setText(this.splashMessage.replace('{COUNT}', '?')); this.splashMessageText.setText(this.splashMessage.replace('{COUNT}', '?'));
const ui = this.getUi(); const ui = this.getUi();