From 4d804d787c0f2dfd914ad689cd73108eed766f67 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Fri, 17 May 2024 03:14:09 +0200 Subject: [PATCH 01/21] Minor French modifier-type.ts edits (#1004) * Minor correction French modifier-type.ts * Update modifier-type.ts * Update modifier-type.ts --- src/locales/fr/modifier-type.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/locales/fr/modifier-type.ts b/src/locales/fr/modifier-type.ts index 2b5e7a54415..96aeeccf4f8 100644 --- a/src/locales/fr/modifier-type.ts +++ b/src/locales/fr/modifier-type.ts @@ -52,7 +52,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Double les chances de tomber sur un combat double pendant {{battleCount}} combats", }, "TempBattleStatBoosterModifierType": { - description: "{{tempBattleStatName}} augmentée d’1 cran pour tout l’équipe pendant 5 combats", + description: "Augmente d’1 cran {{tempBattleStatName}} pour tout l’équipe pendant 5 combats", }, "AttackTypeBoosterModifierType": { description: "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon", @@ -64,7 +64,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Fait monter toute l’équipe d’1 niveau", }, "PokemonBaseStatBoosterModifierType": { - description: "{{statName}} de base de son porteur augmentée de 10%. Plus les IV sont hauts, plus il peut en porter.", + description: "Augmente de 10% {{statName}} de base de son porteur. Plus les IV sont hauts, plus il peut en porter.", }, "AllPokemonFullHpRestoreModifierType": { description: "Restaure tous les PV de toute l'équipe", @@ -162,7 +162,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "SUPER_LURE": { name: "Super Parfum" }, "MAX_LURE": { name: "Parfum Max" }, - "MEMORY_MUSHROOM": { name: "Champignon Mémoriel", description: "Remémore une capacité à un Pokémon" }, + "MEMORY_MUSHROOM": { name: "Champi Mémoriel", description: "Remémore une capacité à un Pokémon" }, "EXP_SHARE": { name: "Multi Exp", description: "Tous les non-participants reçoivent 20% des Points d’Exp d’un participant" }, "EXP_BALANCE": { name: "Équilibr’Exp", description: "Équilibre les Points d’Exp à l’avantage des membres de l’équipe aux plus bas niveaux" }, From 71d9f11d9401cd6d7536e2e315bab36fa053149e Mon Sep 17 00:00:00 2001 From: Madmadness65 Date: Thu, 16 May 2024 20:19:16 -0500 Subject: [PATCH 02/21] Allow Dada Zarude to be encountered MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Another cosmetic Pokémon form for a mythical is now available. --- src/battle-scene.ts | 1 + src/data/battler-tags.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index f15cf1a52e2..0f75447a500 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1013,6 +1013,7 @@ export default class BattleScene extends SceneBase { case Species.FURFROU: case Species.ORICORIO: case Species.MAGEARNA: + case Species.ZARUDE: case Species.SQUAWKABILLY: case Species.TATSUGIRI: case Species.PALDEA_TAUROS: diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index f66b5b2a0d9..3dca2a3cadf 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -14,7 +14,7 @@ import { BattlerTagType } from "./enums/battler-tag-type"; import { TerrainType } from "./terrain"; import { WeatherType } from "./weather"; import { BattleStat } from "./battle-stat"; -import { allAbilities } from "./ability" +import { allAbilities } from "./ability"; export enum BattlerTagLapseType { FAINT, From 7561521020d29eb7e2191f00dc38294a8c3f1b34 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Thu, 16 May 2024 21:41:38 -0400 Subject: [PATCH 03/21] Add endings for classic mode --- public/images/cg/end_f.png | Bin 0 -> 53035 bytes public/images/cg/end_m.png | Bin 0 -> 41829 bytes src/data/dialogue.ts | 19 ++++ src/loading-scene.ts | 3 + src/phases.ts | 152 ++++++++++++++++++++-------- src/ui/battle-message-ui-handler.ts | 2 +- 6 files changed, 132 insertions(+), 44 deletions(-) create mode 100644 public/images/cg/end_f.png create mode 100644 public/images/cg/end_m.png diff --git a/public/images/cg/end_f.png b/public/images/cg/end_f.png new file mode 100644 index 0000000000000000000000000000000000000000..84f94d7e05d30cca31929a24dc43d05a2fa4ffdb GIT binary patch literal 53035 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 z�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 z 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 literal 0 HcmV?d00001 diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index 055e5627a52..e54196d9e25 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -2290,6 +2290,25 @@ export const battleSpecDialogue = { } }; +export const miscDialogue = { + ending: [ + `@c{smile}Oh? You won?@d{96} @c{smile_eclosed}I guess I should've known.\nBut, you're back now. + $@c{smile}It's over.@d{64} You ended the loop. + $@c{serious_smile_fists}You fulfilled your dream too, didn't you?\nYou didn't lose even once. + $@c{neutral}I'm the only one who'll remember what you did.@d{96}\nI guess that's okay, isn't it? + $@c{serious_smile_fists}Your legend will always live on in our hearts. + $@c{smile_eclosed}Anyway, I've had about enough of this place, haven't you? Let's head home. + $@c{serious_smile_fists}Maybe when we get back, we can have another battle?\nIf you're up to it.`, + `@c{shock}You're back?@d{32} Does that mean…@d{96} you won?!\n@c{smile_ehalf}I should have known you had it in you. + $@c{smile_eclosed}Of course… I always had that feeling.\n@c{smile}It's over now, right? You ended the loop. + $@c{smile_ehalf}You fulfilled your dream too, didn't you?\nYou didn't lose even once. + $I'll be the only one to remember what you did.\n@c{angry_mopen}I'll try not to forget! + $@c{smile_wave_wink}Just kidding!@d{64} @c{smile}I'd never forget.@d{32}\nYour legend will live on in our hearts. + $@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place. + $Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?` + ] +} + export function getCharVariantFromDialogue(message: string): string { const variantMatch = /@c\{(.*?)\}/.exec(message); if (variantMatch) diff --git a/src/loading-scene.ts b/src/loading-scene.ts index a49fed480e6..56d0ab47f13 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -209,6 +209,9 @@ export class LoadingScene extends SceneBase { this.loadImage('egg_list_bg', 'ui'); + this.loadImage('end_m', 'cg'); + this.loadImage('end_f', 'cg'); + for (let i = 0; i < 10; i++) { this.loadAtlas(`pokemon_icons_${i}`, ''); if (i) diff --git a/src/phases.ts b/src/phases.ts index f44b4bcaa0b..89b4974b853 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -37,7 +37,7 @@ import { BattleType, BattlerIndex, TurnCommand } from "./battle"; import { BattleSpec } from "./enums/battle-spec"; import { Species } from "./data/enums/species"; import { HealAchv, LevelAchv, achvs } from "./system/achv"; -import { TrainerSlot, trainerConfigs } from "./data/trainer-config"; +import { TrainerConfig, TrainerSlot, trainerConfigs } from "./data/trainer-config"; import { TrainerType } from "./data/enums/trainer-type"; import { EggHatchPhase } from "./egg-hatch-phase"; import { Egg } from "./data/egg"; @@ -46,7 +46,7 @@ import { loggedInUser, updateUserInfo } from "./account"; import { PlayerGender, SessionSaveData } from "./system/game-data"; import { addPokeballCaptureStars, addPokeballOpenParticles } from "./field/anims"; import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeManualTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangePreMoveTrigger } from "./data/pokemon-forms"; -import { battleSpecDialogue, getCharVariantFromDialogue } from "./data/dialogue"; +import { battleSpecDialogue, getCharVariantFromDialogue, miscDialogue } from "./data/dialogue"; import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "./ui/modifier-select-ui-handler"; import { Setting } from "./system/settings"; import { Tutorial, handleTutorial } from "./tutorial"; @@ -59,6 +59,7 @@ import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarte import i18next from './plugins/i18n'; import { Abilities } from "./data/enums/abilities"; import * as Overrides from './overrides'; +import { TextStyle, addTextObject } from "./ui/text"; export class LoginPhase extends Phase { private showText: boolean; @@ -160,7 +161,6 @@ export class TitlePhase extends Phase { this.scene.gameData.getSession(loggedInUser.lastSessionSlot).then(sessionData => { if (sessionData) { this.lastSessionData = sessionData; - console.log(sessionData); const biomeKey = getBiomeKey(sessionData.arena.biome); const bgTexture = `${biomeKey}_bg`; this.scene.arenaBg.setTexture(bgTexture); @@ -3219,11 +3219,10 @@ export class FaintPhase extends PokemonPhase { if (defeatSource?.isOnField()) { applyPostVictoryAbAttrs(PostVictoryAbAttr, defeatSource); const pvmove = allMoves[pokemon.turnData.attacksReceived[0].move]; - const pvattrs = pvmove.getAttrs(PostVictoryStatChangeAttr); + const pvattrs = pvmove.getAttrs(PostVictoryStatChangeAttr) as PostVictoryStatChangeAttr[]; if (pvattrs.length) { - for (let pvattr of pvattrs) { + for (let pvattr of pvattrs) pvattr.applyPostVictory(defeatSource, defeatSource, pvmove); - } } } } @@ -3537,12 +3536,10 @@ export class GameOverModifierRewardPhase extends ModifierRewardPhase { this.scene.addModifier(newModifier).then(() => { this.scene.playSound('level_up_fanfare'); this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.fadeIn(250).then(() => { - this.scene.ui.showText(`You received\n${newModifier.type.name}!`, null, () => { - this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); - resolve(); - }, null, true, 1500); - }); + this.scene.ui.showText(`You received\n${newModifier.type.name}!`, null, () => { + this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); + resolve(); + }, null, true, 1500); }); }) } @@ -3563,11 +3560,9 @@ export class RibbonModifierRewardPhase extends ModifierRewardPhase { this.scene.addModifier(newModifier).then(() => { this.scene.playSound('level_up_fanfare'); this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.fadeIn(250).then(() => { - this.scene.ui.showText(`${this.species.name} beat ${this.scene.gameMode.getName()} Mode for the first time!\nYou received ${newModifier.type.name}!`, null, () => { - resolve(); - }, null, true, 1500); - }); + this.scene.ui.showText(`${this.species.name} beat ${this.scene.gameMode.getName()} Mode for the first time!\nYou received ${newModifier.type.name}!`, null, () => { + resolve(); + }, null, true, 1500); }); }) } @@ -3619,6 +3614,7 @@ export class GameOverPhase extends BattlePhase { handleGameOver(): void { const doGameOver = (newClear: boolean) => { + this.scene.disableMenu = true; this.scene.time.delayedCall(1000, () => { let firstClear = false; if (this.victory && newClear) { @@ -3640,20 +3636,40 @@ export class GameOverPhase extends BattlePhase { const activeBattlers = this.scene.getField().filter(p => p?.isActive(true)); activeBattlers.map(p => p.hideInfo()); this.scene.ui.fadeOut(fadeDuration).then(() => { - [ this.scene.field, ...activeBattlers ].map(a => a.setVisible(false)); + activeBattlers.map(a => a.setVisible(false)); this.scene.setFieldScale(1, true); this.scene.clearPhaseQueue(); this.scene.ui.clearText(); - if (newClear) - this.handleUnlocks(); - if (this.victory && newClear) { - for (let species of this.firstRibbons) - this.scene.unshiftPhase(new RibbonModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PLUS, species)); - if (!firstClear) - this.scene.unshiftPhase(new GameOverModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PREMIUM)); + + const clear = (endCardPhase?: EndCardPhase) => { + if (newClear) + this.handleUnlocks(); + if (this.victory && newClear) { + for (let species of this.firstRibbons) + this.scene.unshiftPhase(new RibbonModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PLUS, species)); + if (!firstClear) + this.scene.unshiftPhase(new GameOverModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PREMIUM)); + } + this.scene.pushPhase(new PostGameOverPhase(this.scene, endCardPhase)); + this.end(); } - this.scene.pushPhase(new PostGameOverPhase(this.scene)); - this.end(); + + if (this.victory) { + this.scene.ui.fadeIn(500).then(() => { + this.scene.charSprite.showCharacter(`rival_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'm' : 'f'}`, getCharVariantFromDialogue(miscDialogue.ending[this.scene.gameData.gender === PlayerGender.FEMALE ? 0 : 1])).then(() => { + this.scene.ui.showDialogue(miscDialogue.ending[this.scene.gameData.gender === PlayerGender.FEMALE ? 0 : 1], this.scene.gameData.gender === PlayerGender.FEMALE ? trainerConfigs[TrainerType.RIVAL].name : trainerConfigs[TrainerType.RIVAL].nameFemale, null, () => { + this.scene.ui.fadeOut(500).then(() => { + this.scene.charSprite.hide().then(() => { + const endCardPhase = new EndCardPhase(this.scene); + this.scene.unshiftPhase(endCardPhase); + clear(endCardPhase); + }); + }); + }); + }); + }); + } else + clear(); }); }); }; @@ -3696,6 +3712,41 @@ export class GameOverPhase extends BattlePhase { } } +export class EndCardPhase extends Phase { + public endCard: Phaser.GameObjects.Image; + public text: Phaser.GameObjects.Text; + + constructor(scene: BattleScene) { + super(scene); + } + + start(): void { + super.start(); + + this.scene.ui.getMessageHandler().bg.setVisible(false); + this.scene.ui.getMessageHandler().nameBoxContainer.setVisible(false); + + this.endCard = this.scene.add.image(0, 0, `end_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'f' : 'm'}`); + this.endCard.setOrigin(0); + this.endCard.setScale(0.5); + this.scene.field.add(this.endCard); + + this.text = addTextObject(this.scene, this.scene.game.canvas.width / 12, (this.scene.game.canvas.height / 6) - 16, 'Congratulations!', TextStyle.SUMMARY, { fontSize: '128px' }); + this.text.setOrigin(0.5); + this.scene.field.add(this.text); + + this.scene.ui.clearText(); + + this.scene.ui.fadeIn(1000).then(() => { + + this.scene.ui.showText('', null, () => { + this.scene.ui.getMessageHandler().bg.setVisible(true); + this.end(); + }, null, true); + }); + } +} + export class UnlockPhase extends Phase { private unlockable: Unlockables; @@ -3710,35 +3761,50 @@ export class UnlockPhase extends Phase { this.scene.gameData.unlocks[this.unlockable] = true; this.scene.playSound('level_up_fanfare'); this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.fadeIn(250).then(() => { - this.scene.ui.showText(`${getUnlockableName(this.unlockable)}\nhas been unlocked.`, null, () => { - this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); - this.end(); - }, null, true, 1500); - }); + this.scene.ui.showText(`${getUnlockableName(this.unlockable)}\nhas been unlocked.`, null, () => { + this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); + this.end(); + }, null, true, 1500); }); } } export class PostGameOverPhase extends Phase { - constructor(scene: BattleScene) { + private endCardPhase: EndCardPhase; + + constructor(scene: BattleScene, endCardPhase: EndCardPhase) { super(scene); + + this.endCardPhase = endCardPhase; } start() { super.start(); - this.scene.gameData.saveAll(this.scene, true, true, true).then(success => { - if (!success) - return this.scene.reset(true); - this.scene.gameData.tryClearSession(this.scene, this.scene.sessionSlotId).then((success: boolean | [boolean, boolean]) => { - if (!success[0]) + const saveAndReset = () => { + this.scene.gameData.saveAll(this.scene, true, true, true).then(success => { + if (!success) return this.scene.reset(true); - this.scene.reset(); - this.scene.unshiftPhase(new TitlePhase(this.scene)); - this.end(); + this.scene.gameData.tryClearSession(this.scene, this.scene.sessionSlotId).then((success: boolean | [boolean, boolean]) => { + if (!success[0]) + return this.scene.reset(true); + this.scene.reset(); + this.scene.unshiftPhase(new TitlePhase(this.scene)); + this.end(); + }); }); - }); + }; + + if (this.endCardPhase) { + this.scene.ui.fadeOut(500).then(() => { + this.scene.ui.getMessageHandler().bg.setVisible(true); + + this.endCardPhase.endCard.destroy(); + this.endCardPhase.text.destroy(); + saveAndReset(); + }); + } else + saveAndReset(); } } diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index d04a98ea810..abcf04b7cc8 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -31,7 +31,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.textCallbackTimer = null; const bg = this.scene.add.sprite(0, 0, 'bg', this.scene.windowType); - bg.setOrigin(0, 1); + bg.setOrigin(0, 1); ui.add(bg); this.bg = bg; From e035e85811d8f515370268f21e3310b5a8de02c3 Mon Sep 17 00:00:00 2001 From: Vaner42 <94883874+Vaner42@users.noreply.github.com> Date: Fri, 17 May 2024 10:42:12 +0800 Subject: [PATCH 04/21] Translate 'trainer' into Simplified Chinese. (#1006) Co-authored-by: Junhan --- src/locales/zh_CN/trainers.ts | 506 +++++++++++++++++++--------------- 1 file changed, 282 insertions(+), 224 deletions(-) diff --git a/src/locales/zh_CN/trainers.ts b/src/locales/zh_CN/trainers.ts index a02383a4f54..b3b89d0057d 100644 --- a/src/locales/zh_CN/trainers.ts +++ b/src/locales/zh_CN/trainers.ts @@ -2,239 +2,297 @@ import {SimpleTranslationEntries} from "#app/plugins/i18n"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { - "elite_four": "Elite Four", - "gym_leader": "Gym Leader", - "gym_leader_female": "Gym Leader", - "champion": "Champion", - "rival": "Rival", - "professor": "Professor", - "frontier_brain": "Frontier Brain", + "elite_four": "四天王", + "gym_leader": "道馆馆主", + "gym_leader_female": "道馆馆主", + "champion": "冠军", + "rival": "劲敌", + "professor": "博士", + "frontier_brain": "开拓头脑", // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; // Titles of trainers like "Youngster" or "Lass" export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Ace Trainer", - "ace_trainer_female": "Ace Trainer", - "ace_duo": "Ace Duo", - "artist": "Artist", - "artist_female": "Artist", - "backers": "Backers", - "backpacker": "Backpacker", - "backpacker_female": "Backpacker", - "backpackers": "Backpackers", - "baker": "Baker", - "battle_girl": "Battle Girl", - "beauty": "Beauty", - "beginners": "Beginners", - "biker": "Biker", - "black_belt": "Black Belt", - "breeder": "Breeder", - "breeder_female": "Breeder", - "breeders": "Breeders", - "clerk": "Clerk", - "clerk_female": "Clerk", - "colleagues": "Colleagues", - "crush_kin": "Crush Kin", - "cyclist": "Cyclist", - "cyclist_female": "Cyclist", - "cyclists": "Cyclists", - "dancer": "Dancer", - "dancer_female": "Dancer", - "depot_agent": "Depot Agent", - "doctor": "Doctor", - "doctor_female": "Doctor", - "fishermen": "Fishermen", - "fishermen_female": "Fishermen", - "gentleman": "Gentleman", - "guitarist": "Guitarist", - "guitarist_female": "Guitarist", - "harlequin": "Harlequin", - "hiker": "Hiker", - "hooligans": "Hooligans", - "hoopster": "Hoopster", - "infielder": "Infielder", - "janitor": "Janitor", - "lady": "Lady", - "lass": "Lass", - "linebacker": "Linebacker", - "maid": "Maid", - "madame": "Madame", - "medical_team": "Medical Team", - "musican": "Musician", - "hex_maniac": "Hex Maniac", - "nurse": "Nurse", - "nursery_aide": "Nursery Aide", - "officer": "Officer", - "parasol_lady": "Parasol Lady", - "pilot": "Pilot", - "poké_fan": "Poké Fan", - "poké_fan_family": "Poké Fan Family", - "preschooler": "Preschooler", - "preschooler_female": "Preschooler", - "preschoolers": "Preschoolers", - "psychic": "Psychic", - "psychic_female": "Psychic", - "psychics": "Psychics", - "pokémon_ranger": "Pokémon Ranger", - "pokémon_rangers": "Pokémon Ranger", - "ranger": "Ranger", - "restaurant_staff": "Restaurant Staff", - "rich_boy": "Rich Boy", - "rich_couple": "Rich Couple", - "rich_kids": "Rich Kids", - "roughneck": "Roughneck", - "scientist": "Scientist", - "scientist_female": "Scientist", - "scientists": "Scientists", - "smasher": "Smasher", - "snow_worker": "Snow Worker", - "snow_worker_female": "Snow Worker", - "striker": "Striker", - "school_kid": "School Kid", - "school_kid_female": "School Kid", - "school_kids": "School Kids", - "swimmer": "Swimmer", - "swimmer_female": "Swimmer", - "swimmers": "Swimmers", - "twins": "Twins", - "veteran": "Veteran", - "veteran_female": "Veteran", - "veteran_duo": "Veteran Duo", - "waiter": "Waiter", - "waitress": "Waitress", - "worker": "Worker", - "worker_female": "Worker", - "workers": "Workers", - "youngster": "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": "医生", + "fishermen": "垂钓者", + "fishermen_female": "垂钓者", + "gentleman": "绅士", + "guitarist": "吉他手", + "guitarist_female": "吉他手", + "harlequin": "滑稽演员", + "hiker": "登山男", + "hooligans": "坏组合", + "hoopster": "篮球选手", + "infielder": "棒球选手", + "janitor": "清洁员", + "lady": "千金小姐", + "lass": "迷你裙", + "linebacker": "美式橄榄球选手", + "maid": "女仆", + "madame": "女士", + "medical_team": "医疗团队", + "musican": "音乐家", + "hex_maniac": "灵异迷", + "nurse": "护士", + "nursery_aide": "幼儿园老师", + "officer": "警察", + "parasol_lady": "阳伞姐姐", + "pilot": "飞行员", + "poké_fan": "发烧友俱乐部", + "poké_fan_family": "同好夫妇", + "preschooler": "幼儿园小朋友", + "preschooler_female": "幼儿园小朋友", + "preschoolers": "幼儿园小朋友组合", + "psychic": "超能力者", + "psychic_female": "超能力者", + "psychics": "超能力者组合", + "pokémon_ranger": "宝可梦巡护员", + "pokémon_rangers": "宝可梦巡护员组合", + "ranger": "巡护员", + "restaurant_staff": "服务生组合", + "rich_boy": "富家少爷", + "rich_couple": "富豪夫妇", + "rich_kids": "富二代组合", + "roughneck": "光头男", + "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": "短裤小子" } as const; // Names of special trainers like gym leaders, elite four, and the champion export const trainerNames: SimpleTranslationEntries = { - "brock": "Brock", - "misty": "Misty", - "lt_surge": "Lt Surge", - "erika": "Erika", - "janine": "Janine", - "sabrina": "Sabrina", - "blaine": "Blaine", - "giovanni": "Giovanni", - "falkner": "Falkner", - "bugsy": "Bugsy", - "whitney": "Whitney", - "morty": "Morty", - "chuck": "Chuck", - "jasmine": "Jasmine", - "pryce": "Pryce", - "clair": "Clair", - "roxanne": "Roxanne", - "brawly": "Brawly", - "wattson": "Wattson", - "flannery": "Flannery", - "norman": "Norman", - "winona": "Winona", - "tate": "Tate", - "liza": "Liza", - "juan": "Juan", - "roark": "Roark", - "gardenia": "Gardenia", - "maylene": "Maylene", - "crasher_wake": "Crasher Wake", - "fantina": "Fantina", - "byron": "Byron", - "candice": "Candice", - "volkner": "Volkner", - "cilan": "Cilan", - "chili": "Chili", - "cress": "Cress", - "cheren": "Cheren", - "lenora": "Lenora", - "roxie": "Roxie", - "burgh": "Burgh", - "elesa": "Elesa", - "clay": "Clay", - "skyla": "Skyla", - "brycen": "Brycen", - "drayden": "Drayden", - "marlon": "Marlon", - "viola": "Viola", - "grant": "Grant", - "korrina": "Korrina", - "ramos": "Ramos", - "clemont": "Clemont", - "valerie": "Valerie", - "olympia": "Olympia", - "wulfric": "Wulfric", - "milo": "Milo", - "nessa": "Nessa", - "kabu": "Kabu", - "bea": "Bea", - "allister": "Allister", - "opal": "Opal", - "bede": "Bede", - "gordie": "Gordie", - "melony": "Melony", - "piers": "Piers", - "marnie": "Marnie", - "raihan": "Raihan", - "katy": "Katy", - "brassius": "Brassius", - "iono": "Iono", - "kofu": "Kofu", - "larry": "Larry", - "ryme": "Ryme", - "tulip": "Tulip", - "grusha": "Grusha", - "lorelei": "Lorelei", - "bruno": "Bruno", - "agatha": "Agatha", - "lance": "Lance", - "will": "Will", - "koga": "Koga", - "karen": "Karen", - "sidney": "Sidney", - "phoebe": "Phoebe", - "glacia": "Glacia", - "drake": "Drake", - "aaron": "Aaron", - "bertha": "Bertha", - "flint": "Flint", - "lucian": "Lucian", - "shauntal": "Shauntal", - "marshal": "Marshal", - "grimsley": "Grimsley", - "caitlin": "Caitlin", - "malva": "Malva", - "siebold": "Siebold", - "wikstrom": "Wikstrom", - "drasna": "Drasna", - "hala": "Hala", - "molayne": "Molayne", - "olivia": "Olivia", - "acerola": "Acerola", - "kahili": "Kahili", - "rika": "Rika", - "poppy": "Poppy", - "larry_elite": "Larry", // Does this really need to be an extra entry? (it is in trainer-type.ts so I added it here) - "hassel": "Hassel", - "crispin": "Crispin", - "amarys": "Amarys", - "lacey": "Lacey", - "drayton": "Drayton", - "blue": "Blue", - "red": "Red", - "lance_champion": "Lance", // Does this really need to be an extra entry? (it is in trainer-type.ts so I added it here) - "steven": "Steven", - "wallace": "Wallace", - "cynthia": "Cynthia", - "alder": "Alder", - "iris": "Iris", - "diantha": "Diantha", + // ---- 馆主 Gym leader ---- + // 关都地区 Kanto Region + "brock": "小刚", + "misty": "小霞", + "lt_surge": "马志士", + "erika": "莉佳", + "janine": "阿杏", + "sabrina": "娜姿", + "blaine": "夏伯", + "giovanni": "坂木", + + // 城都地区 Johto Region + "falkner": "阿速", + "bugsy": "阿笔", + "whitney": "小茜", + "morty": "松叶", + "chuck": "阿四", + "jasmine": "阿蜜", + "pryce": "柳伯", + "clair": "小椿", + + // 丰缘地区 Hoenn Region + "roxanne": "杜娟", + "brawly": "藤树", + "wattson": "铁旋", + "flannery": "亚莎", + "norman": "千里", + "winona": "娜琪", + "tate": "小枫", + "liza": "小南", + "juan": "亚当", + + // 神奥地区 Sinnoh Region + "roark": "瓢太", + "gardenia": "菜种", + "maylene": "阿李", + "crasher_wake": "吉宪", + "fantina": "梅丽莎", + "byron": "东瓜", + "candice": "小菘", + "volkner": "电次", + + // 合众地区 Unova Region + "cilan": "天桐", + "chili": "伯特", + "cress": "寇恩", + "cheren": "黑连", + "lenora": "芦荟", + "roxie": "霍米加", + "burgh": "亚堤", + "elesa": "小菊儿", + "clay": "菊老大", + "skyla": "风露", + "brycen": "哈奇库", + "drayden": "夏卡", + "marlon": "西子伊", + + // 卡洛斯地区 Kalos Region + "viola": "紫罗兰", + "grant": "查克洛", + "korrina": "可尔妮", + "ramos": "福爷", + "clemont": "希特隆", + "valerie": "玛绣", + "olympia": "葛吉花", + "wulfric": "得抚", + + // 伽勒尔地区 Galar Region + "milo": "亚洛", + "nessa": "露璃娜", + "kabu": "卡芜", + "bea": "彩豆", + "allister": "欧尼奥", + "opal": "波普菈", + "bede": "彼特", + "gordie": "玛瓜", + "melony": "美蓉", + "piers": "聂梓", + "marnie": "玛俐", + "raihan": "奇巴纳", + + // 帕底亚地区 Paldea Region + "katy": "阿枫", + "brassius": "寇沙", + "iono": "奇树", + "kofu": "海岱", + "larry": "青木", + "ryme": "莱姆", + "tulip": "莉普", + "grusha": "古鲁夏", + + // ---- 四天王 Elite Four ---- + // 关都地区 Kanto Region + "lorelei": "科拿", + "bruno": "希巴", + "agatha": "菊子", + "lance": "阿渡", + + // 城都地区 Johto Region + "will": "一树", + "koga": "阿桔", + "karen": "梨花", + + // 丰都地区 Hoenn Region + "sidney": "花月", + "phoebe": "芙蓉", + "glacia": "波妮", + "drake": "源治", + + // 神奥地区 Sinnoh Region + "aaron": "阿柳", + "bertha": "菊野", + "flint": "大叶", + "lucian": "悟松", + + // 合众地区 Unova Region + "shauntal": "婉龙", + "marshal": "连武", + "grimsley": "越橘", + "caitlin": "嘉德丽雅", + + // 卡洛斯地区 Kalos Region + "malva": "帕琦拉", + "siebold": "志米", + "wikstrom": "雁铠", + "drasna": "朵拉塞娜", + + // 阿罗拉地区 Alola Region + "hala": "哈拉", + "molayne": "马睿因", + "olivia": "丽姿", + "acerola": "阿塞萝拉", + "kahili": "卡希丽", + + // 帕底亚地区 Paldea Region + "rika": "辛俐", + "poppy": "波琵", + "larry_elite": "青木", // Does this really need to be an extra entry? (it is in trainer-type.ts so I added it here) + "hassel": "八朔", + + // 蓝莓学院 Blueberry Academy + "crispin": "赤松", + "amarys": "纳莉", + "lacey": "紫竽", + "drayton": "杜若", + + // ---- 冠军 Champion ---- + // 关都地区 Kanto Region + "blue": "青绿", + "red": "赤红", + + // 城都地区 Johto Region + "lance_champion": "阿渡", // Does this really need to be an extra entry? (it is in trainer-type.ts so I added it here) + + // 丰缘地区 Hoenn Region + "steven": "大吾", + "wallace": "米可利", + + // 神奥地区 Sinnoh Region + "cynthia": "竹兰", + + // 合众地区 Unova Region + "alder": "阿戴克", + "iris": "艾莉丝", + + // 卡洛斯地区 Kalos Region + "diantha": "哈乌", + + // 阿罗拉地区 Alola Region "hau": "Hau", - "geeta": "Geeta", - "nemona": "Nemona", - "kieran": "Kieran", + + // 伽勒尔地区 Galar Region "leon": "Leon", - "rival": "Finn", - "rival_female": "Ivy", + + // 帕底亚地区 paldea Region + "geeta": "也慈", + "nemona": "妮莫", + + // 蓝莓学院 Blueberry academy + "kieran": "乌栗", + + // 劲敌 rival + "rival": "芬恩", + "rival_female": "艾薇", } as const; From dd3d38b5d86ea21817f0dd7b2dd89d95b163c41b Mon Sep 17 00:00:00 2001 From: Vaner42 <94883874+Vaner42@users.noreply.github.com> Date: Fri, 17 May 2024 11:03:26 +0800 Subject: [PATCH 05/21] =?UTF-8?q?fixed=20translate=20'hau'=E3=80=81=20?= =?UTF-8?q?=E2=80=98diantha=E2=80=99=20=E3=80=81=E2=80=98leon=E2=80=99=20i?= =?UTF-8?q?nto=20Simplified=20Chinese.=20(#1009)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Translate 'trainer' into Simplified Chinese. * fixed translate 'hau'、 ‘diantha’ 、‘leon’ into Simplified Chinese. --------- Co-authored-by: Junhan --- src/locales/zh_CN/trainers.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/locales/zh_CN/trainers.ts b/src/locales/zh_CN/trainers.ts index b3b89d0057d..5db37c78a6b 100644 --- a/src/locales/zh_CN/trainers.ts +++ b/src/locales/zh_CN/trainers.ts @@ -277,13 +277,13 @@ export const trainerNames: SimpleTranslationEntries = { "iris": "艾莉丝", // 卡洛斯地区 Kalos Region - "diantha": "哈乌", + "diantha": "卡露妮", // 阿罗拉地区 Alola Region - "hau": "Hau", + "hau": "哈乌", // 伽勒尔地区 Galar Region - "leon": "Leon", + "leon": "丹帝", // 帕底亚地区 paldea Region "geeta": "也慈", From 1bd3ec2fd662d966c70526d067bc7dc4acf42005 Mon Sep 17 00:00:00 2001 From: Charlie Giang <146129103+charliegiang@users.noreply.github.com> Date: Thu, 16 May 2024 22:09:40 -0500 Subject: [PATCH 06/21] Fix ingrain for Phantump and Trevenant (#856) (#998) --- src/data/battler-tags.ts | 7 ++++++- src/phases.ts | 11 ++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 3dca2a3cadf..6ab249864cd 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -15,6 +15,7 @@ import { TerrainType } from "./terrain"; import { WeatherType } from "./weather"; import { BattleStat } from "./battle-stat"; import { allAbilities } from "./ability"; +import { Species } from "./enums/species"; export enum BattlerTagLapseType { FAINT, @@ -117,7 +118,11 @@ export class TrappedTag extends BattlerTag { } canAdd(pokemon: Pokemon): boolean { - return !pokemon.isOfType(Type.GHOST) && !pokemon.getTag(BattlerTagType.TRAPPED); + const isGhost = pokemon.isOfType(Type.GHOST); + const isTrapped = pokemon.getTag(BattlerTagType.TRAPPED); + const isAllowedGhostType = pokemon.species.speciesId === Species.PHANTUMP || pokemon.species.speciesId === Species.TREVENANT; + + return !isTrapped && (!isGhost || isAllowedGhostType); } onAdd(pokemon: Pokemon): void { diff --git a/src/phases.ts b/src/phases.ts index 89b4974b853..90d9a54d288 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -60,6 +60,8 @@ import i18next from './plugins/i18n'; import { Abilities } from "./data/enums/abilities"; import * as Overrides from './overrides'; import { TextStyle, addTextObject } from "./ui/text"; +import { Type } from "./data/type"; + export class LoginPhase extends Phase { private showText: boolean; @@ -1816,7 +1818,14 @@ export class CommandPhase extends FieldPhase { if (!isSwitch && this.fieldIndex) this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; } else if (trapTag) { - if (!isSwitch) { + if(trapTag.sourceMove === Moves.INGRAIN && this.scene.getPokemonById(trapTag.sourceId).isOfType(Type.GHOST)) { + success = true; + this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch + ? { command: Command.POKEMON, cursor: cursor, args: args } + : { command: Command.RUN }; + break; + } + if (!isSwitch) { this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.MESSAGE); } From f2b5a1b6f4aa4603188af6ca5a3024164abc845c Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+TempsRay@users.noreply.github.com> Date: Thu, 16 May 2024 23:11:53 -0400 Subject: [PATCH 07/21] Fix some Pokemon classifications (#857) --- src/data/move.ts | 2 +- src/data/pokemon-species.ts | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 81e6c8f8566..7f0e03266e8 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1921,7 +1921,7 @@ export class CopyStatsAttr extends MoveEffectAttr { target.updateInfo(); user.updateInfo(); - target.scene.queueMessage(getPokemonMessage(user, 'copied\n') + getPokemonMessage(target, `'s stat changes!`)); + target.scene.queueMessage(getPokemonMessage(user, ' copied\n') + getPokemonMessage(target, `'s stat changes!`)); return true; } diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index c8f99936941..218423d3232 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1504,7 +1504,7 @@ export function initSpecies() { new PokemonForm("Origin Forme", "origin", Type.WATER, Type.DRAGON, 6.3, 659, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 90, 100, 100, 150, 120, 120, 3, 0, 340), ), new PokemonSpecies(Species.HEATRAN, 4, true, false, false, "Lava Dome Pokémon", Type.FIRE, Type.STEEL, 1.7, 430, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.FLAME_BODY, 600, 91, 90, 106, 130, 106, 77, 3, 100, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.REGIGIGAS, 4, false, true, false, "Colossal Pokémon", Type.NORMAL, null, 3.7, 420, Abilities.SLOW_START, Abilities.NONE, Abilities.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.REGIGIGAS, 4, true, false, false, "Colossal Pokémon", Type.NORMAL, null, 3.7, 420, Abilities.SLOW_START, Abilities.NONE, Abilities.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.GIRATINA, 4, false, true, false, "Renegade Pokémon", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false, true, new PokemonForm("Altered Forme", "altered", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340), new PokemonForm("Origin Forme", "origin", Type.GHOST, Type.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), @@ -1931,7 +1931,7 @@ export function initSpecies() { new PokemonForm("Active Mode", "active", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340) ), new PokemonSpecies(Species.YVELTAL, 6, false, true, false, "Destruction Pokémon", Type.DARK, Type.FLYING, 5.8, 203, Abilities.DARK_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ZYGARDE, 6, true, false, false, "Order Pokémon", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, GrowthRate.SLOW, null, false, false, + new PokemonSpecies(Species.ZYGARDE, 6, false, true, false, "Order Pokémon", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, GrowthRate.SLOW, null, false, false, new PokemonForm("50% Forme", "50", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, ""), new PokemonForm("10% Forme", "10", Type.DRAGON, Type.GROUND, 1.2, 33.5, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 300), new PokemonForm("50% Forme Power Construct", "50-pc", Type.DRAGON, Type.GROUND, 5, 305, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, ""), @@ -2285,7 +2285,7 @@ export function initSpecies() { new PokemonSpecies(Species.REGIDRAGO, 8, true, false, false, "Dragon Orb Pokémon", Type.DRAGON, null, 2.1, 200, Abilities.DRAGONS_MAW, Abilities.NONE, Abilities.NONE, 580, 200, 100, 50, 100, 50, 80, 3, 35, 290, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.GLASTRIER, 8, true, false, false, "Wild Horse Pokémon", Type.ICE, null, 2.2, 800, Abilities.CHILLING_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 145, 130, 65, 110, 30, 3, 35, 290, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.SPECTRIER, 8, true, false, false, "Swift Horse Pokémon", Type.GHOST, null, 2, 44.5, Abilities.GRIM_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 65, 60, 145, 80, 130, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.CALYREX, 8, true, false, false, "King Pokémon", Type.PSYCHIC, Type.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, GrowthRate.SLOW, null, false, true, + new PokemonSpecies(Species.CALYREX, 8, false, true, false, "King Pokémon", Type.PSYCHIC, Type.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", Type.PSYCHIC, Type.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250), new PokemonForm("Ice", "ice", Type.PSYCHIC, Type.ICE, 2.4, 809.1, Abilities.AS_ONE_GLASTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 165, 150, 85, 130, 50, 3, 100, 250), new PokemonForm("Shadow", "shadow", Type.PSYCHIC, Type.GHOST, 2.4, 53.6, Abilities.AS_ONE_SPECTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 85, 80, 165, 100, 150, 3, 100, 250), @@ -2453,10 +2453,10 @@ export function initSpecies() { new PokemonForm("Unremarkable Form", "unremarkable", Type.GRASS, Type.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178), new PokemonForm("Masterpiece Form", "masterpiece", Type.GRASS, Type.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178), ), - new PokemonSpecies(Species.OKIDOGI, 9, false, true, false, "Retainer Pokémon", Type.POISON, Type.FIGHTING, 1.8, 92.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.GUARD_DOG, 555, 88, 128, 115, 58, 86, 80, 3, 0, 276, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.MUNKIDORI, 9, false, true, false, "Retainer Pokémon", Type.POISON, Type.PSYCHIC, 1, 12.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.FRISK, 555, 88, 75, 66, 130, 90, 106, 3, 0, 276, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.FEZANDIPITI, 9, false, true, false, "Retainer Pokémon", Type.POISON, Type.FAIRY, 1.4, 30.1, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.TECHNICIAN, 555, 88, 91, 82, 70, 125, 99, 3, 0, 276, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.OGERPON, 9, false, true, false, "Mask Pokémon", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, GrowthRate.SLOW, 0, false, false, + new PokemonSpecies(Species.OKIDOGI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.FIGHTING, 1.8, 92.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.GUARD_DOG, 555, 88, 128, 115, 58, 86, 80, 3, 0, 276, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.MUNKIDORI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.PSYCHIC, 1, 12.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.FRISK, 555, 88, 75, 66, 130, 90, 106, 3, 0, 276, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.FEZANDIPITI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.FAIRY, 1.4, 30.1, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.TECHNICIAN, 555, 88, 91, 82, 70, 125, 99, 3, 0, 276, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.OGERPON, 9, true, false, false, "Mask Pokémon", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, GrowthRate.SLOW, 0, false, false, new PokemonForm("Teal Mask", "teal-mask", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), new PokemonForm("Wellspring Mask", "wellspring-mask", Type.GRASS, Type.WATER, 1.2, 39.8, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), new PokemonForm("Hearthflame Mask", "hearthflame-mask", Type.GRASS, Type.FIRE, 1.2, 39.8, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), From f2dff2cd25202afaa5bd2f9fb9bfb97a9f2ed7c0 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Fri, 17 May 2024 00:20:18 -0400 Subject: [PATCH 08/21] End card only shows in classic mode --- src/phases.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phases.ts b/src/phases.ts index 90d9a54d288..91e098edf1f 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -3663,7 +3663,7 @@ export class GameOverPhase extends BattlePhase { this.end(); } - if (this.victory) { + if (this.victory && this.scene.gameMode.isClassic) { this.scene.ui.fadeIn(500).then(() => { this.scene.charSprite.showCharacter(`rival_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'm' : 'f'}`, getCharVariantFromDialogue(miscDialogue.ending[this.scene.gameData.gender === PlayerGender.FEMALE ? 0 : 1])).then(() => { this.scene.ui.showDialogue(miscDialogue.ending[this.scene.gameData.gender === PlayerGender.FEMALE ? 0 : 1], this.scene.gameData.gender === PlayerGender.FEMALE ? trainerConfigs[TrainerType.RIVAL].name : trainerConfigs[TrainerType.RIVAL].nameFemale, null, () => { From 0cd305d78acf79964c193a7c6ae078fee3f92ce3 Mon Sep 17 00:00:00 2001 From: Benjamin Odom Date: Fri, 17 May 2024 00:01:35 -0500 Subject: [PATCH 09/21] Fix Trainer Localization Typos (#1010) Took a look at some of the entries for trainers and adjusted accordingly. it looks like all of these trainer types were grabbed from an online source as a sort of future-proofing which is good, but resulted in some errors. Some of which have already been fixed, and some which are included here. Also prevents an issue if there is a missing image and displays a warning in the console instead of a crash. --- src/field/trainer.ts | 21 +++++++++++++++++---- src/locales/de/trainers.ts | 14 +++++++++----- src/locales/en/trainers.ts | 14 +++++++++----- src/locales/es/trainers.ts | 14 +++++++++----- src/locales/fr/trainers.ts | 14 +++++++++----- src/locales/it/trainers.ts | 14 +++++++++----- src/locales/pt_BR/trainers.ts | 14 +++++++++----- src/locales/zh_CN/trainers.ts | 14 +++++++++----- 8 files changed, 80 insertions(+), 39 deletions(-) diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 9213dc0135d..faa691406b9 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -378,16 +378,29 @@ export default class Trainer extends Phaser.GameObjects.Container { }; const sprites = this.getSprites(); const tintSprites = this.getTintSprites(); - sprites[0].play(trainerAnimConfig); - tintSprites[0].play(trainerAnimConfig); + + // Don't try to play an animation when there isn't one + if (sprites.length > 1) { + sprites[0].play(trainerAnimConfig); + tintSprites[0].play(trainerAnimConfig); + } + else + console.warn(`No animation found for '${this.getKey()}'. Is this intentional?`); + if (this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) { const partnerTrainerAnimConfig = { key: this.getKey(true), repeat: 0, startFrame: 0 }; - sprites[1].play(partnerTrainerAnimConfig); - tintSprites[1].play(partnerTrainerAnimConfig); + + // Don't try to play an animation when there isn't one + if (sprites.length > 1) { + sprites[1].play(partnerTrainerAnimConfig); + tintSprites[1].play(partnerTrainerAnimConfig); + } + else + console.warn(`No animation found for '${this.getKey()}'. Is this intentional?`); } } diff --git a/src/locales/de/trainers.ts b/src/locales/de/trainers.ts index 90d6cbf20b1..1820c7eb281 100644 --- a/src/locales/de/trainers.ts +++ b/src/locales/de/trainers.ts @@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = { "depot_agent": "Bahnangestellter", "doctor": "Arzt", "doctor_female": "Ärztin", - "fishermen": "Angler", - "fishermen_female": "Angler", // Seems to be the same in german but exists in other languages like italian + "fisherman": "Angler", + "fisherman_female": "Angler", // Seems to be the same in german but exists in other languages like italian "gentleman": "Gentleman", "guitarist": "Gitarrist", "guitarist_female": "Gitarristin", @@ -61,15 +61,15 @@ export const trainerClasses: SimpleTranslationEntries = { "maid": "Zofe", "madame": "Madam", "medical_team": "Mediziner", - "musican": "Musiker", + "musician": "Musiker", "hex_maniac": "Hexe", "nurse": "Pflegerin", "nursery_aide": "Erzieherin", "officer": "Polizist", "parasol_lady": "Schirmdame", "pilot": "Pilot", - "poké_fan": "Pokéfan", - "poké_fan_family": "Pokéfan-Pärchen", + "pokefan": "Pokéfan", + "pokefan_family": "Pokéfan-Pärchen", "preschooler": "Vorschüler", "preschooler_female": "Vorschülerin", "preschoolers": "Vorschüler", @@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = { "pokémon_rangers": "Pokémon-Ranger", "ranger": "Ranger", "restaurant_staff": "Restaurant Angestellte", + "rich": "Rich", + "rich_female": "Rich", "rich_boy": "Schnösel", "rich_couple": "Reiches Paar", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", "rich_kids": "Schnösel", "roughneck": "Raufbold", "scientist": "Forscher", diff --git a/src/locales/en/trainers.ts b/src/locales/en/trainers.ts index a02383a4f54..d824baeba8f 100644 --- a/src/locales/en/trainers.ts +++ b/src/locales/en/trainers.ts @@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = { "depot_agent": "Depot Agent", "doctor": "Doctor", "doctor_female": "Doctor", - "fishermen": "Fishermen", - "fishermen_female": "Fishermen", + "fisherman": "Fisherman", + "fisherman_female": "Fisherman", "gentleman": "Gentleman", "guitarist": "Guitarist", "guitarist_female": "Guitarist", @@ -61,15 +61,15 @@ export const trainerClasses: SimpleTranslationEntries = { "maid": "Maid", "madame": "Madame", "medical_team": "Medical Team", - "musican": "Musician", + "musician": "Musician", "hex_maniac": "Hex Maniac", "nurse": "Nurse", "nursery_aide": "Nursery Aide", "officer": "Officer", "parasol_lady": "Parasol Lady", "pilot": "Pilot", - "poké_fan": "Poké Fan", - "poké_fan_family": "Poké Fan Family", + "pokefan": "Poké Fan", + "pokefan_family": "Poké Fan Family", "preschooler": "Preschooler", "preschooler_female": "Preschooler", "preschoolers": "Preschoolers", @@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = { "pokémon_rangers": "Pokémon Ranger", "ranger": "Ranger", "restaurant_staff": "Restaurant Staff", + "rich": "Rich", + "rich_female": "Rich", "rich_boy": "Rich Boy", "rich_couple": "Rich Couple", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", "rich_kids": "Rich Kids", "roughneck": "Roughneck", "scientist": "Scientist", diff --git a/src/locales/es/trainers.ts b/src/locales/es/trainers.ts index a02383a4f54..443718693ca 100644 --- a/src/locales/es/trainers.ts +++ b/src/locales/es/trainers.ts @@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = { "depot_agent": "Depot Agent", "doctor": "Doctor", "doctor_female": "Doctor", - "fishermen": "Fishermen", - "fishermen_female": "Fishermen", + "fisherman": "Fisherman", + "fisherman_female": "Fisherman", "gentleman": "Gentleman", "guitarist": "Guitarist", "guitarist_female": "Guitarist", @@ -61,15 +61,15 @@ export const trainerClasses: SimpleTranslationEntries = { "maid": "Maid", "madame": "Madame", "medical_team": "Medical Team", - "musican": "Musician", + "musician": "Musician", "hex_maniac": "Hex Maniac", "nurse": "Nurse", "nursery_aide": "Nursery Aide", "officer": "Officer", "parasol_lady": "Parasol Lady", "pilot": "Pilot", - "poké_fan": "Poké Fan", - "poké_fan_family": "Poké Fan Family", + "pokefan": "Poké Fan", + "pokefan_family": "Poké Fan Family", "preschooler": "Preschooler", "preschooler_female": "Preschooler", "preschoolers": "Preschoolers", @@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = { "pokémon_rangers": "Pokémon Ranger", "ranger": "Ranger", "restaurant_staff": "Restaurant Staff", + "rich": "Rich", + "rich_female": "Rich", "rich_boy": "Rich Boy", "rich_couple": "Rich Couple", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", "rich_kids": "Rich Kids", "roughneck": "Roughneck", "scientist": "Scientist", diff --git a/src/locales/fr/trainers.ts b/src/locales/fr/trainers.ts index 146a2766f37..2d5c78bbfc5 100644 --- a/src/locales/fr/trainers.ts +++ b/src/locales/fr/trainers.ts @@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = { "depot_agent": "Cheminot", "doctor": "Docteur", "doctor_female": "Docteure", - "fishermen": "Pêcheur", - "fishermen_female": "Pêcheuse", + "fisherman": "Pêcheur", + "fisherman_female": "Pêcheuse", "gentleman": "Gentleman", "guitarist": "Guitariste", "guitarist_female": "Guitariste", @@ -60,16 +60,16 @@ export const trainerClasses: SimpleTranslationEntries = { "linebacker": "Quaterback", "maid": "Gouvernante", "madame": "Mondaine", - "musican": "Musicien", "medical_team": "Médecins", + "musician": "Musicien", "hex_maniac": "Mystimaniac", "nurse": "Infirmière", "nursery_aide": "Institutrice", "officer": "Policier", "parasol_lady": "Sœur Parasol", "pilot": "Pilote", - "poké_fan": "Poké Fan", - "poké_fan_family": "Couple de Pokéfans", + "pokefan": "Poké Fan", + "pokefan_family": "Couple de Pokéfans", "preschooler": "Petit", "preschooler_female": "Petite", "preschoolers": "Petits", @@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = { "pokémon_rangers": "Pokémon Rangers", "ranger": "Ranger", "restaurant_staff": "Serveurs", + "rich": "Rich", + "rich_female": "Rich", "rich_boy": "Richard", "rich_couple": "Couple de Bourgeois", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", "rich_kids": "Richards", "roughneck": "Loubard", "scientist": "Scientifique", diff --git a/src/locales/it/trainers.ts b/src/locales/it/trainers.ts index a02383a4f54..443718693ca 100644 --- a/src/locales/it/trainers.ts +++ b/src/locales/it/trainers.ts @@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = { "depot_agent": "Depot Agent", "doctor": "Doctor", "doctor_female": "Doctor", - "fishermen": "Fishermen", - "fishermen_female": "Fishermen", + "fisherman": "Fisherman", + "fisherman_female": "Fisherman", "gentleman": "Gentleman", "guitarist": "Guitarist", "guitarist_female": "Guitarist", @@ -61,15 +61,15 @@ export const trainerClasses: SimpleTranslationEntries = { "maid": "Maid", "madame": "Madame", "medical_team": "Medical Team", - "musican": "Musician", + "musician": "Musician", "hex_maniac": "Hex Maniac", "nurse": "Nurse", "nursery_aide": "Nursery Aide", "officer": "Officer", "parasol_lady": "Parasol Lady", "pilot": "Pilot", - "poké_fan": "Poké Fan", - "poké_fan_family": "Poké Fan Family", + "pokefan": "Poké Fan", + "pokefan_family": "Poké Fan Family", "preschooler": "Preschooler", "preschooler_female": "Preschooler", "preschoolers": "Preschoolers", @@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = { "pokémon_rangers": "Pokémon Ranger", "ranger": "Ranger", "restaurant_staff": "Restaurant Staff", + "rich": "Rich", + "rich_female": "Rich", "rich_boy": "Rich Boy", "rich_couple": "Rich Couple", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", "rich_kids": "Rich Kids", "roughneck": "Roughneck", "scientist": "Scientist", diff --git a/src/locales/pt_BR/trainers.ts b/src/locales/pt_BR/trainers.ts index 7c12814dfae..af6393bce8e 100644 --- a/src/locales/pt_BR/trainers.ts +++ b/src/locales/pt_BR/trainers.ts @@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = { "depot_agent": "Ferroviário", "doctor": "Doutor", "doctor_female": "Doutora", - "fishermen": "Pescador", - "fishermen_female": "Pescadora", + "fisherman": "Pescador", + "fisherman_female": "Pescadora", "gentleman": "Gentleman", "guitarist": "Guitarrista", "guitarist_female": "Guitarrista", @@ -60,16 +60,16 @@ export const trainerClasses: SimpleTranslationEntries = { "linebacker": "Zagueiro", "maid": "Doméstica", "madame": "Madame", - "musican": "Músico", "medical_team": "Medical Team", + "musician": "Músico", "hex_maniac": "Ocultista", "nurse": "Enfermeira", "nursery_aide": "Professora do Berçário", "officer": "Policial", "parasol_lady": "Moça de Sombrinha", "pilot": "Piloto", - "poké_fan": "Pokefã", - "poké_fan_family": "Poké Fan Family", + "pokefan": "Pokefã", + "pokefan_family": "Poké Fan Family", "preschooler": "Menino do Prezinho", "preschooler_female": "Menina do Prezinho", "preschoolers": "Preschoolers", @@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = { "pokémon_rangers": "Pokémon Ranger", "ranger": "Guarda", "restaurant_staff": "Restaurant Staff", + "rich": "Rich", + "rich_female": "Rich", "rich_boy": "Rich Boy", "rich_couple": "Rich Couple", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", "rich_kids": "Rich Kids", "roughneck": "Arruaceiro", "scientist": "Cientista", diff --git a/src/locales/zh_CN/trainers.ts b/src/locales/zh_CN/trainers.ts index 5db37c78a6b..fae8301c627 100644 --- a/src/locales/zh_CN/trainers.ts +++ b/src/locales/zh_CN/trainers.ts @@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = { "depot_agent": "铁路员工", "doctor": "医生", "doctor_female": "医生", - "fishermen": "垂钓者", - "fishermen_female": "垂钓者", + "fisherman": "垂钓者", + "fisherman_female": "垂钓者", "gentleman": "绅士", "guitarist": "吉他手", "guitarist_female": "吉他手", @@ -61,15 +61,15 @@ export const trainerClasses: SimpleTranslationEntries = { "maid": "女仆", "madame": "女士", "medical_team": "医疗团队", - "musican": "音乐家", + "musician": "音乐家", "hex_maniac": "灵异迷", "nurse": "护士", "nursery_aide": "幼儿园老师", "officer": "警察", "parasol_lady": "阳伞姐姐", "pilot": "飞行员", - "poké_fan": "发烧友俱乐部", - "poké_fan_family": "同好夫妇", + "pokefan": "发烧友俱乐部", + "pokefan_family": "同好夫妇", "preschooler": "幼儿园小朋友", "preschooler_female": "幼儿园小朋友", "preschoolers": "幼儿园小朋友组合", @@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = { "pokémon_rangers": "宝可梦巡护员组合", "ranger": "巡护员", "restaurant_staff": "服务生组合", + "rich": "Rich", + "rich_female": "Rich", "rich_boy": "富家少爷", "rich_couple": "富豪夫妇", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", "rich_kids": "富二代组合", "roughneck": "光头男", "scientist": "研究员", From b4f643f0faea8890c660bd060f8f690b2b5ba1e0 Mon Sep 17 00:00:00 2001 From: Jakub Hanko <60473007+JakubHanko@users.noreply.github.com> Date: Fri, 17 May 2024 07:42:43 +0200 Subject: [PATCH 10/21] Use getBattleStat instead of getStat in BattleStatRatioPowerAttr (#742) * Use getBattleStat instead of getStat in BattleStatRatioPowerAttr * Change unnecessary let into const * Refactor BattleStatRatioPowerAttr into two distinct classes * Add TSDoc for the new classes --- src/data/move.ts | 76 ++++++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 7f0e03266e8..99ef179ad30 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -2129,36 +2129,27 @@ export class WeightPowerAttr extends VariablePowerAttr { } } -export class BattleStatRatioPowerAttr extends VariablePowerAttr { - private stat: Stat; - private invert: boolean; - - constructor(stat: Stat, invert: boolean = false) { - super(); - - this.stat = stat; - this.invert = invert; - } - +/** + * Attribute used for Electro Ball move. + * @extends VariablePowerAttr + * @see {@linkcode apply} + **/ +export class ElectroBallPowerAttr extends VariablePowerAttr { + /** + * Move that deals more damage the faster {@linkcode BattleStat.SPD} + * the user is compared to the target. + * @param user Pokemon that used the move + * @param target The target of the move + * @param move Move with this attribute + * @param args N/A + * @returns true if the function succeeds + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const power = args[0] as Utils.NumberHolder; - const statRatio = target.getStat(this.stat) / user.getStat(this.stat); + const statRatio = target.getBattleStat(Stat.SPD) / user.getBattleStat(Stat.SPD); const statThresholds = [ 0.25, 1 / 3, 0.5, 1, -1 ]; - let statThresholdPowers = [ 150, 120, 80, 60, 40 ]; - - if (this.invert) { - // Gyro ball uses a specific formula - let userSpeed = user.getBattleStat(this.stat); - if (userSpeed < 1) { - // Gen 6+ always have 1 base power - power.value = 1; - return true; - } - let bp = Math.floor(Math.min(150, 25 * target.getBattleStat(this.stat) / userSpeed + 1)); - power.value = bp; - return true; - } + const statThresholdPowers = [ 150, 120, 80, 60, 40 ]; let w = 0; while (w < statThresholds.length - 1 && statRatio > statThresholds[w]) { @@ -2167,7 +2158,36 @@ export class BattleStatRatioPowerAttr extends VariablePowerAttr { } power.value = statThresholdPowers[w]; + return true; + } +} + +/** + * Attribute used for Gyro Ball move. + * @extends VariablePowerAttr + * @see {@linkcode apply} + **/ +export class GyroBallPowerAttr extends VariablePowerAttr { + /** + * Move that deals more damage the slower {@linkcode BattleStat.SPD} + * the user is compared to the target. + * @param user Pokemon that used the move + * @param target The target of the move + * @param move Move with this attribute + * @param args N/A + * @returns true if the function succeeds + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const power = args[0] as Utils.NumberHolder; + const userSpeed = user.getBattleStat(Stat.SPD); + if (userSpeed < 1) { + // Gen 6+ always have 1 base power + power.value = 1; + return true; + } + + power.value = Math.floor(Math.min(150, 25 * target.getBattleStat(Stat.SPD) / userSpeed + 1)); return true; } } @@ -5388,7 +5408,7 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPD, -1, true) .punchingMove(), new AttackMove(Moves.GYRO_BALL, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) - .attr(BattleStatRatioPowerAttr, Stat.SPD, true) + .attr(GyroBallPowerAttr) .ballBombMove(), new SelfStatusMove(Moves.HEALING_WISH, Type.PSYCHIC, -1, 10, -1, 0, 4) .attr(SacrificialFullRestoreAttr) @@ -5741,7 +5761,7 @@ export function initMoves() { .condition(unknownTypeCondition) .attr(hitsSameTypeAttr), new AttackMove(Moves.ELECTRO_BALL, Type.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5) - .attr(BattleStatRatioPowerAttr, Stat.SPD) + .attr(ElectroBallPowerAttr) .ballBombMove(), new StatusMove(Moves.SOAK, Type.WATER, 100, 20, -1, 0, 5) .attr(ChangeTypeAttr, Type.WATER), From 61938869c1f80cbb97a716e8b136b7d7b64694cc Mon Sep 17 00:00:00 2001 From: Gerafique <155723753+Gerafique@users.noreply.github.com> Date: Fri, 17 May 2024 11:56:11 +0200 Subject: [PATCH 11/21] Added German Translations for menu.ts (#960) --- src/locales/de/menu.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/locales/de/menu.ts b/src/locales/de/menu.ts index 7d96f9130eb..0d33fb4cbd8 100644 --- a/src/locales/de/menu.ts +++ b/src/locales/de/menu.ts @@ -12,10 +12,10 @@ export const menu: SimpleTranslationEntries = { "loadGame": "Spiel laden", "newGame": "Neues Spiel", "selectGameMode": "Wähle einen Spielmodus", - "logInOrCreateAccount": "Logge dich ein oder erstelle einen Account zum starten. Keine Email nötig!", + "logInOrCreateAccount": "Melde dich an oder erstelle einen Account zum starten. Keine Email nötig!", "username": "Benutzername", "password": "Passwort", - "login": "Einloggen", + "login": "Anmelden", "register": "Registrieren", "emptyUsername": "Benutzername darf nicht leer sein", "invalidLoginUsername": "Der eingegebene Benutzername ist ungültig", @@ -26,20 +26,20 @@ export const menu: SimpleTranslationEntries = { "accountNonExistent": "Der eingegebene Benutzer existiert nicht", "unmatchingPassword": "Das eingegebene Passwort stimmt nicht überein", "passwordNotMatchingConfirmPassword": "Passwort muss mit Bestätigungspasswort übereinstimmen", - "confirmPassword": "Besätige Passwort", + "confirmPassword": "Bestätige Passwort", "registrationAgeWarning": "Mit der Registrierung bestätigen Sie, dass Sie 13 Jahre oder älter sind.", - "backToLogin": "Zurück zum Einloggen", + "backToLogin": "Zurück zur Anmeldung", "failedToLoadSaveData": "Speicherdaten konnten nicht geladen werden. Bitte laden Sie die Seite neu.\nWenn dies weiterhin der Fall ist, wenden Sie sich bitte an den Administrator.", "sessionSuccess": "Sitzung erfolgreich geladen.", "failedToLoadSession": "Ihre Sitzungsdaten konnten nicht geladen werden.\nSie könnten beschädigt sein.", "boyOrGirl": "Bist du ein Junge oder ein Mädchen?", "boy": "Junge", "girl": "Mädchen", - "evolving": "What?\n{{pokemonName}} is evolving!", - "stoppedEvolving": "{{pokemonName}} stopped evolving.", - "pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.", - "evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.", - "evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!", + "evolving": "Nanu?\n{{pokemonName}} entwickelt sich!", + "stoppedEvolving": "Hm? {{pokemonName}} hat die Entwicklung \nabgebrochen.", // "Hm? Entwicklung wurde abgebrochen!" without naming the pokemon seems to be the original. + "pauseEvolutionsQuestion": "Die Entwicklung von {{pokemonName}} vorübergehend pausieren?\nEntwicklungen können im Gruppenmenü wieder aktiviert werden.", + "evolutionsPaused": "Entwicklung von {{pokemonName}} pausiert.", + "evolutionDone": "Glückwunsch!\nDein {{pokemonName}} entwickelte sich zu {{evolvedPokemonName}}!", "dailyRankings": "Tägliche Rangliste", "weeklyRankings": "Wöchentliche Rangliste", "noRankings": "Keine Rangliste", @@ -48,4 +48,4 @@ export const menu: SimpleTranslationEntries = { "empty":"Leer", "yes":"Ja", "no":"Nein", -} as const; \ No newline at end of file +} as const; From 250142083a21214d6cd4823239809c5741d215a9 Mon Sep 17 00:00:00 2001 From: FanHua Date: Fri, 17 May 2024 18:09:08 +0800 Subject: [PATCH 12/21] Implements localization for BerryType (#1007) --- src/data/berry.ts | 29 ++++------------------ src/locales/de/berry.ts | 48 +++++++++++++++++++++++++++++++++++++ src/locales/de/config.ts | 2 ++ src/locales/en/berry.ts | 48 +++++++++++++++++++++++++++++++++++++ src/locales/en/config.ts | 3 +++ src/locales/es/berry.ts | 48 +++++++++++++++++++++++++++++++++++++ src/locales/es/config.ts | 2 ++ src/locales/fr/berry.ts | 48 +++++++++++++++++++++++++++++++++++++ src/locales/fr/config.ts | 2 ++ src/locales/it/berry.ts | 48 +++++++++++++++++++++++++++++++++++++ src/locales/it/config.ts | 2 ++ src/locales/pt_BR/berry.ts | 48 +++++++++++++++++++++++++++++++++++++ src/locales/pt_BR/config.ts | 2 ++ src/locales/zh_CN/berry.ts | 48 +++++++++++++++++++++++++++++++++++++ src/locales/zh_CN/config.ts | 2 ++ src/plugins/i18n.ts | 10 ++++++++ 16 files changed, 366 insertions(+), 24 deletions(-) create mode 100644 src/locales/de/berry.ts create mode 100644 src/locales/en/berry.ts create mode 100644 src/locales/es/berry.ts create mode 100644 src/locales/fr/berry.ts create mode 100644 src/locales/it/berry.ts create mode 100644 src/locales/pt_BR/berry.ts create mode 100644 src/locales/zh_CN/berry.ts diff --git a/src/data/berry.ts b/src/data/berry.ts index 96b50caa932..1521f3488ef 100644 --- a/src/data/berry.ts +++ b/src/data/berry.ts @@ -7,6 +7,7 @@ import { BattlerTagType } from "./enums/battler-tag-type"; import { getStatusEffectHealText } from "./status-effect"; import * as Utils from "../utils"; import { DoubleBerryEffectAbAttr, ReduceBerryUseThresholdAbAttr, applyAbAttrs } from "./ability"; +import i18next from '../plugins/i18n'; export enum BerryType { SITRUS, @@ -22,32 +23,12 @@ export enum BerryType { LEPPA } -export function getBerryName(berryType: BerryType) { - return `${Utils.toReadableString(BerryType[berryType])} Berry`; +export function getBerryName(berryType: BerryType): string { + return i18next.t(`berry:${BerryType[berryType]}.name`); } -export function getBerryEffectDescription(berryType: BerryType) { - switch (berryType) { - case BerryType.SITRUS: - return 'Restores 25% HP if HP is below 50%'; - case BerryType.LUM: - return 'Cures any non-volatile status condition and confusion'; - case BerryType.ENIGMA: - return 'Restores 25% HP if hit by a super effective move'; - case BerryType.LIECHI: - case BerryType.GANLON: - case BerryType.PETAYA: - case BerryType.APICOT: - case BerryType.SALAC: - const stat = (berryType - BerryType.LIECHI) as BattleStat; - return `Raises ${getBattleStatName(stat)} if HP is below 25%`; - case BerryType.LANSAT: - return 'Raises critical hit ratio if HP is below 25%'; - case BerryType.STARF: - return 'Sharply raises a random stat if HP is below 25%'; - case BerryType.LEPPA: - return 'Restores 10 PP to a move if its PP reaches 0'; - } +export function getBerryEffectDescription(berryType: BerryType): string { + return i18next.t(`berry:${BerryType[berryType]}.effect`); } export type BerryPredicate = (pokemon: Pokemon) => boolean; diff --git a/src/locales/de/berry.ts b/src/locales/de/berry.ts new file mode 100644 index 00000000000..8c8bc5ee280 --- /dev/null +++ b/src/locales/de/berry.ts @@ -0,0 +1,48 @@ +import { BerryTranslationEntries } from "#app/plugins/i18n"; + +export const berry: BerryTranslationEntries = { + "SITRUS": { + name: "Sitrus Berry", + effect: "Restores 25% HP if HP is below 50%", + }, + "LUM": { + name: "Lum Berry", + effect: "Cures any non-volatile status condition and confusion", + }, + "ENIGMA": { + name: "Enigma Berry", + effect: "Restores 25% HP if hit by a super effective move", + }, + "LIECHI": { + name: "Liechi Berry", + effect: "Raises Attack if HP is below 25%", + }, + "GANLON": { + name: "Ganlon Berry", + effect: "Raises Defense if HP is below 25%", + }, + "PETAYA": { + name: "Petaya Berry", + effect: "Raises Sp. Atk if HP is below 25%", + }, + "APICOT": { + name: "Apicot Berry", + effect: "Raises Sp. Def if HP is below 25%", + }, + "SALAC": { + name: "Salac Berry", + effect: "Raises Speed if HP is below 25%", + }, + "LANSAT": { + name: "Lansat Berry", + effect: "Raises critical hit ratio if HP is below 25%", + }, + "STARF": { + name: "Starf Berry", + effect: "Sharply raises a random stat if HP is below 25%", + }, + "LEPPA": { + name: "Leppa Berry", + effect: "Restores 10 PP to a move if its PP reaches 0", + }, +} as const; \ No newline at end of file diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index 44bd5a66f1a..9ff1699778b 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -18,6 +18,7 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { berry } from "./berry"; export const deConfig = { @@ -43,4 +44,5 @@ export const deConfig = { trainerNames: trainerNames, tutorial: tutorial, weather: weather, + berry: berry, } diff --git a/src/locales/en/berry.ts b/src/locales/en/berry.ts new file mode 100644 index 00000000000..8c8bc5ee280 --- /dev/null +++ b/src/locales/en/berry.ts @@ -0,0 +1,48 @@ +import { BerryTranslationEntries } from "#app/plugins/i18n"; + +export const berry: BerryTranslationEntries = { + "SITRUS": { + name: "Sitrus Berry", + effect: "Restores 25% HP if HP is below 50%", + }, + "LUM": { + name: "Lum Berry", + effect: "Cures any non-volatile status condition and confusion", + }, + "ENIGMA": { + name: "Enigma Berry", + effect: "Restores 25% HP if hit by a super effective move", + }, + "LIECHI": { + name: "Liechi Berry", + effect: "Raises Attack if HP is below 25%", + }, + "GANLON": { + name: "Ganlon Berry", + effect: "Raises Defense if HP is below 25%", + }, + "PETAYA": { + name: "Petaya Berry", + effect: "Raises Sp. Atk if HP is below 25%", + }, + "APICOT": { + name: "Apicot Berry", + effect: "Raises Sp. Def if HP is below 25%", + }, + "SALAC": { + name: "Salac Berry", + effect: "Raises Speed if HP is below 25%", + }, + "LANSAT": { + name: "Lansat Berry", + effect: "Raises critical hit ratio if HP is below 25%", + }, + "STARF": { + name: "Starf Berry", + effect: "Sharply raises a random stat if HP is below 25%", + }, + "LEPPA": { + name: "Leppa Berry", + effect: "Restores 10 PP to a move if its PP reaches 0", + }, +} as const; \ No newline at end of file diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index 2962633e26a..b2dfe9c9b4c 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -18,6 +18,8 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { berry } from "./berry"; + export const enConfig = { ability: ability, @@ -42,4 +44,5 @@ export const enConfig = { trainerNames: trainerNames, tutorial: tutorial, weather: weather, + berry: berry, } diff --git a/src/locales/es/berry.ts b/src/locales/es/berry.ts new file mode 100644 index 00000000000..8c8bc5ee280 --- /dev/null +++ b/src/locales/es/berry.ts @@ -0,0 +1,48 @@ +import { BerryTranslationEntries } from "#app/plugins/i18n"; + +export const berry: BerryTranslationEntries = { + "SITRUS": { + name: "Sitrus Berry", + effect: "Restores 25% HP if HP is below 50%", + }, + "LUM": { + name: "Lum Berry", + effect: "Cures any non-volatile status condition and confusion", + }, + "ENIGMA": { + name: "Enigma Berry", + effect: "Restores 25% HP if hit by a super effective move", + }, + "LIECHI": { + name: "Liechi Berry", + effect: "Raises Attack if HP is below 25%", + }, + "GANLON": { + name: "Ganlon Berry", + effect: "Raises Defense if HP is below 25%", + }, + "PETAYA": { + name: "Petaya Berry", + effect: "Raises Sp. Atk if HP is below 25%", + }, + "APICOT": { + name: "Apicot Berry", + effect: "Raises Sp. Def if HP is below 25%", + }, + "SALAC": { + name: "Salac Berry", + effect: "Raises Speed if HP is below 25%", + }, + "LANSAT": { + name: "Lansat Berry", + effect: "Raises critical hit ratio if HP is below 25%", + }, + "STARF": { + name: "Starf Berry", + effect: "Sharply raises a random stat if HP is below 25%", + }, + "LEPPA": { + name: "Leppa Berry", + effect: "Restores 10 PP to a move if its PP reaches 0", + }, +} as const; \ No newline at end of file diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index a986bbfc75c..61b01cfa6b5 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -18,6 +18,7 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { berry } from "./berry"; export const esConfig = { @@ -43,4 +44,5 @@ export const esConfig = { trainerNames: trainerNames, tutorial: tutorial, weather: weather, + berry: berry, } diff --git a/src/locales/fr/berry.ts b/src/locales/fr/berry.ts new file mode 100644 index 00000000000..8c8bc5ee280 --- /dev/null +++ b/src/locales/fr/berry.ts @@ -0,0 +1,48 @@ +import { BerryTranslationEntries } from "#app/plugins/i18n"; + +export const berry: BerryTranslationEntries = { + "SITRUS": { + name: "Sitrus Berry", + effect: "Restores 25% HP if HP is below 50%", + }, + "LUM": { + name: "Lum Berry", + effect: "Cures any non-volatile status condition and confusion", + }, + "ENIGMA": { + name: "Enigma Berry", + effect: "Restores 25% HP if hit by a super effective move", + }, + "LIECHI": { + name: "Liechi Berry", + effect: "Raises Attack if HP is below 25%", + }, + "GANLON": { + name: "Ganlon Berry", + effect: "Raises Defense if HP is below 25%", + }, + "PETAYA": { + name: "Petaya Berry", + effect: "Raises Sp. Atk if HP is below 25%", + }, + "APICOT": { + name: "Apicot Berry", + effect: "Raises Sp. Def if HP is below 25%", + }, + "SALAC": { + name: "Salac Berry", + effect: "Raises Speed if HP is below 25%", + }, + "LANSAT": { + name: "Lansat Berry", + effect: "Raises critical hit ratio if HP is below 25%", + }, + "STARF": { + name: "Starf Berry", + effect: "Sharply raises a random stat if HP is below 25%", + }, + "LEPPA": { + name: "Leppa Berry", + effect: "Restores 10 PP to a move if its PP reaches 0", + }, +} as const; \ No newline at end of file diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index 8de3e186d59..ef8f8bb7538 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -18,6 +18,7 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { berry } from "./berry"; export const frConfig = { @@ -43,5 +44,6 @@ export const frConfig = { trainerNames: trainerNames, tutorial: tutorial, weather: weather, + berry: berry, } diff --git a/src/locales/it/berry.ts b/src/locales/it/berry.ts new file mode 100644 index 00000000000..8c8bc5ee280 --- /dev/null +++ b/src/locales/it/berry.ts @@ -0,0 +1,48 @@ +import { BerryTranslationEntries } from "#app/plugins/i18n"; + +export const berry: BerryTranslationEntries = { + "SITRUS": { + name: "Sitrus Berry", + effect: "Restores 25% HP if HP is below 50%", + }, + "LUM": { + name: "Lum Berry", + effect: "Cures any non-volatile status condition and confusion", + }, + "ENIGMA": { + name: "Enigma Berry", + effect: "Restores 25% HP if hit by a super effective move", + }, + "LIECHI": { + name: "Liechi Berry", + effect: "Raises Attack if HP is below 25%", + }, + "GANLON": { + name: "Ganlon Berry", + effect: "Raises Defense if HP is below 25%", + }, + "PETAYA": { + name: "Petaya Berry", + effect: "Raises Sp. Atk if HP is below 25%", + }, + "APICOT": { + name: "Apicot Berry", + effect: "Raises Sp. Def if HP is below 25%", + }, + "SALAC": { + name: "Salac Berry", + effect: "Raises Speed if HP is below 25%", + }, + "LANSAT": { + name: "Lansat Berry", + effect: "Raises critical hit ratio if HP is below 25%", + }, + "STARF": { + name: "Starf Berry", + effect: "Sharply raises a random stat if HP is below 25%", + }, + "LEPPA": { + name: "Leppa Berry", + effect: "Restores 10 PP to a move if its PP reaches 0", + }, +} as const; \ No newline at end of file diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index 6892c9c8cad..3d8d9b0e4b7 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -18,6 +18,7 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { berry } from "./berry"; export const itConfig = { @@ -43,4 +44,5 @@ export const itConfig = { trainerNames: trainerNames, tutorial: tutorial, weather: weather, + berry: berry, } diff --git a/src/locales/pt_BR/berry.ts b/src/locales/pt_BR/berry.ts new file mode 100644 index 00000000000..8c8bc5ee280 --- /dev/null +++ b/src/locales/pt_BR/berry.ts @@ -0,0 +1,48 @@ +import { BerryTranslationEntries } from "#app/plugins/i18n"; + +export const berry: BerryTranslationEntries = { + "SITRUS": { + name: "Sitrus Berry", + effect: "Restores 25% HP if HP is below 50%", + }, + "LUM": { + name: "Lum Berry", + effect: "Cures any non-volatile status condition and confusion", + }, + "ENIGMA": { + name: "Enigma Berry", + effect: "Restores 25% HP if hit by a super effective move", + }, + "LIECHI": { + name: "Liechi Berry", + effect: "Raises Attack if HP is below 25%", + }, + "GANLON": { + name: "Ganlon Berry", + effect: "Raises Defense if HP is below 25%", + }, + "PETAYA": { + name: "Petaya Berry", + effect: "Raises Sp. Atk if HP is below 25%", + }, + "APICOT": { + name: "Apicot Berry", + effect: "Raises Sp. Def if HP is below 25%", + }, + "SALAC": { + name: "Salac Berry", + effect: "Raises Speed if HP is below 25%", + }, + "LANSAT": { + name: "Lansat Berry", + effect: "Raises critical hit ratio if HP is below 25%", + }, + "STARF": { + name: "Starf Berry", + effect: "Sharply raises a random stat if HP is below 25%", + }, + "LEPPA": { + name: "Leppa Berry", + effect: "Restores 10 PP to a move if its PP reaches 0", + }, +} as const; \ No newline at end of file diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index af714a36316..157df19a80b 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -14,6 +14,7 @@ import { pokemonStat } from "./pokemon-stat"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { berry } from "./berry"; export const ptBrConfig = { @@ -33,4 +34,5 @@ export const ptBrConfig = { growth: growth, weather: weather, modifierType: modifierType, + berry: berry, } \ No newline at end of file diff --git a/src/locales/zh_CN/berry.ts b/src/locales/zh_CN/berry.ts new file mode 100644 index 00000000000..8c8bc5ee280 --- /dev/null +++ b/src/locales/zh_CN/berry.ts @@ -0,0 +1,48 @@ +import { BerryTranslationEntries } from "#app/plugins/i18n"; + +export const berry: BerryTranslationEntries = { + "SITRUS": { + name: "Sitrus Berry", + effect: "Restores 25% HP if HP is below 50%", + }, + "LUM": { + name: "Lum Berry", + effect: "Cures any non-volatile status condition and confusion", + }, + "ENIGMA": { + name: "Enigma Berry", + effect: "Restores 25% HP if hit by a super effective move", + }, + "LIECHI": { + name: "Liechi Berry", + effect: "Raises Attack if HP is below 25%", + }, + "GANLON": { + name: "Ganlon Berry", + effect: "Raises Defense if HP is below 25%", + }, + "PETAYA": { + name: "Petaya Berry", + effect: "Raises Sp. Atk if HP is below 25%", + }, + "APICOT": { + name: "Apicot Berry", + effect: "Raises Sp. Def if HP is below 25%", + }, + "SALAC": { + name: "Salac Berry", + effect: "Raises Speed if HP is below 25%", + }, + "LANSAT": { + name: "Lansat Berry", + effect: "Raises critical hit ratio if HP is below 25%", + }, + "STARF": { + name: "Starf Berry", + effect: "Sharply raises a random stat if HP is below 25%", + }, + "LEPPA": { + name: "Leppa Berry", + effect: "Restores 10 PP to a move if its PP reaches 0", + }, +} as const; \ No newline at end of file diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index 19afba381b8..69f07a4f1a7 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -18,6 +18,7 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { berry } from "./berry"; export const zhCnConfig = { @@ -43,4 +44,5 @@ export const zhCnConfig = { trainerNames: trainerNames, tutorial: tutorial, weather: weather, + berry: berry, } diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 807e1a1b550..30cc4bfcac2 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -46,6 +46,15 @@ export interface ModifierTypeTranslationEntries { TeraType: SimpleTranslationEntries, } +export interface BerryTranslationEntry { + name: string, + effect: string +} + +export interface BerryTranslationEntries { + [key: string]: BerryTranslationEntry +} + export interface Localizable { localize(): void; } @@ -139,6 +148,7 @@ declare module 'i18next' { egg: SimpleTranslationEntries; weather: SimpleTranslationEntries; modifierType: ModifierTypeTranslationEntries; + berry: BerryTranslationEntries; }; } } From a44c1587d443f453683c07a8466ddd001d0c865a Mon Sep 17 00:00:00 2001 From: Laeticia PIERRE Date: Fri, 17 May 2024 12:13:32 +0200 Subject: [PATCH 13/21] Fix some fr (#1013) * Fix some modifier-type fr * Fix some trainers fr * Fix DYNAMAX_BAND fr --- src/locales/fr/modifier-type.ts | 6 +++--- src/locales/fr/trainers.ts | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/locales/fr/modifier-type.ts b/src/locales/fr/modifier-type.ts index 96aeeccf4f8..95daf50f9b1 100644 --- a/src/locales/fr/modifier-type.ts +++ b/src/locales/fr/modifier-type.ts @@ -52,7 +52,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Double les chances de tomber sur un combat double pendant {{battleCount}} combats", }, "TempBattleStatBoosterModifierType": { - description: "Augmente d’1 cran {{tempBattleStatName}} pour tout l’équipe pendant 5 combats", + description: "Augmente d’1 cran {{tempBattleStatName}} pour toute l’équipe pendant 5 combats", }, "AttackTypeBoosterModifierType": { description: "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon", @@ -129,7 +129,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "RARER_CANDY": { name: "Hyper Bonbon" }, "MEGA_BRACELET": { name: "Méga-Bracelet", description: "Débloque les Méga-Gemmes" }, - "DYNAMAX_BAND": { name: "Poignet Dynamax", description: "Débloque les Maxi Champis" }, + "DYNAMAX_BAND": { name: "Poignet Dynamax", description: "Débloque le Dynamax" }, "TERA_ORB": { name: "Orbe Téracristal", description: "Débloque les Téra-Éclats" }, "MAP": { name: "Carte", description: "Vous permet de choisir votre destination à un croisement" }, @@ -264,7 +264,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "fairy_feather": "Plume Enchantée", }, BaseStatBoosterItem: { - "hp_up": "PP Plus", + "hp_up": "PV Plus", "protein": "Protéine", "iron": "Fer", "calcium": "Calcium", diff --git a/src/locales/fr/trainers.ts b/src/locales/fr/trainers.ts index 2d5c78bbfc5..e5386288cb2 100644 --- a/src/locales/fr/trainers.ts +++ b/src/locales/fr/trainers.ts @@ -81,11 +81,11 @@ export const trainerClasses: SimpleTranslationEntries = { "ranger": "Ranger", "restaurant_staff": "Serveurs", "rich": "Rich", - "rich_female": "Rich", - "rich_boy": "Richard", + "rich_female": "Mondaine", + "rich_boy": "Gentleman", "rich_couple": "Couple de Bourgeois", - "rich_kid": "Rich Kid", - "rich_kid_female": "Rich Kid", + "rich_kid": "Richard", + "rich_kid_female": "Mademoiselle", "rich_kids": "Richards", "roughneck": "Loubard", "scientist": "Scientifique", From 96af567cd4d014ffa6afe554d1d2f26fb068022b Mon Sep 17 00:00:00 2001 From: Lugiad Date: Fri, 17 May 2024 12:21:35 +0200 Subject: [PATCH 14/21] IV Scanner Results Translation (#990) * Update battle-message-ui-handler.ts * Update i18n.ts * Update config.ts * Update config.ts * Update config.ts * Update config.ts * Update config.ts * Update config.ts * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update battle-message-ui-handler.ts * German battle-message-ui-handler.ts * Update config.ts --------- Co-authored-by: Benjamin Odom --- src/locales/de/battle-message-ui-handler.ts | 10 ++++++++ src/locales/de/config.ts | 5 ++-- src/locales/en/battle-message-ui-handler.ts | 10 ++++++++ src/locales/en/config.ts | 5 ++-- src/locales/es/battle-message-ui-handler.ts | 10 ++++++++ src/locales/es/config.ts | 5 ++-- src/locales/fr/battle-message-ui-handler.ts | 10 ++++++++ src/locales/fr/config.ts | 6 ++--- src/locales/it/battle-message-ui-handler.ts | 10 ++++++++ src/locales/it/config.ts | 5 ++-- .../pt_BR/battle-message-ui-handler.ts | 10 ++++++++ .../zh_CN/battle-message-ui-handler.ts | 10 ++++++++ src/locales/zh_CN/config.ts | 5 ++-- src/plugins/i18n.ts | 3 ++- src/ui/battle-message-ui-handler.ts | 25 ++++++++++--------- 15 files changed, 103 insertions(+), 26 deletions(-) create mode 100644 src/locales/de/battle-message-ui-handler.ts create mode 100644 src/locales/en/battle-message-ui-handler.ts create mode 100644 src/locales/es/battle-message-ui-handler.ts create mode 100644 src/locales/fr/battle-message-ui-handler.ts create mode 100644 src/locales/it/battle-message-ui-handler.ts create mode 100644 src/locales/pt_BR/battle-message-ui-handler.ts create mode 100644 src/locales/zh_CN/battle-message-ui-handler.ts diff --git a/src/locales/de/battle-message-ui-handler.ts b/src/locales/de/battle-message-ui-handler.ts new file mode 100644 index 00000000000..daedb8550d0 --- /dev/null +++ b/src/locales/de/battle-message-ui-handler.ts @@ -0,0 +1,10 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const battleMessageUiHandler: SimpleTranslationEntries = { + "ivBest": "Sensationell", + "ivFantastic": "Fantastisch", + "ivVeryGood": "Sehr Gut", + "ivPrettyGood": "Gut", + "ivDecent": "Nicht Übel", + "ivNoGood": "Schlecht", +} as const; diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index 9ff1699778b..7aeeeb7a925 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -18,9 +18,9 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; - export const deConfig = { ability: ability, abilityTriggers: abilityTriggers, @@ -44,5 +44,6 @@ export const deConfig = { trainerNames: trainerNames, tutorial: tutorial, weather: weather, + battleMessageUiHandler: battleMessageUiHandler, berry: berry, -} +} \ No newline at end of file diff --git a/src/locales/en/battle-message-ui-handler.ts b/src/locales/en/battle-message-ui-handler.ts new file mode 100644 index 00000000000..346f856872c --- /dev/null +++ b/src/locales/en/battle-message-ui-handler.ts @@ -0,0 +1,10 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const battleMessageUiHandler: SimpleTranslationEntries = { + "ivBest": "Best", + "ivFantastic": "Fantastic", + "ivVeryGood": "Very Good", + "ivPrettyGood": "Pretty Good", + "ivDecent": "Decent", + "ivNoGood": "No Good", +} as const; \ No newline at end of file diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index b2dfe9c9b4c..6b23d2f2983 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -18,9 +18,9 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; - export const enConfig = { ability: ability, abilityTriggers: abilityTriggers, @@ -44,5 +44,6 @@ export const enConfig = { trainerNames: trainerNames, tutorial: tutorial, weather: weather, + battleMessageUiHandler: battleMessageUiHandler, berry: berry, -} +} \ No newline at end of file diff --git a/src/locales/es/battle-message-ui-handler.ts b/src/locales/es/battle-message-ui-handler.ts new file mode 100644 index 00000000000..346f856872c --- /dev/null +++ b/src/locales/es/battle-message-ui-handler.ts @@ -0,0 +1,10 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const battleMessageUiHandler: SimpleTranslationEntries = { + "ivBest": "Best", + "ivFantastic": "Fantastic", + "ivVeryGood": "Very Good", + "ivPrettyGood": "Pretty Good", + "ivDecent": "Decent", + "ivNoGood": "No Good", +} as const; \ No newline at end of file diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index 61b01cfa6b5..a3b06982d33 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -18,9 +18,9 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; - export const esConfig = { ability: ability, abilityTriggers: abilityTriggers, @@ -44,5 +44,6 @@ export const esConfig = { trainerNames: trainerNames, tutorial: tutorial, weather: weather, + battleMessageUiHandler: battleMessageUiHandler, berry: berry, -} +} \ No newline at end of file diff --git a/src/locales/fr/battle-message-ui-handler.ts b/src/locales/fr/battle-message-ui-handler.ts new file mode 100644 index 00000000000..8dc980d49a4 --- /dev/null +++ b/src/locales/fr/battle-message-ui-handler.ts @@ -0,0 +1,10 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const battleMessageUiHandler: SimpleTranslationEntries = { + "ivBest": "Exceptionnel", + "ivFantastic": "Fantastique", + "ivVeryGood": "Très bon", + "ivPrettyGood": "Bon", + "ivDecent": "Passable…", + "ivNoGood": "Pas top…", +} as const; diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index ef8f8bb7538..867a08621bb 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -18,9 +18,9 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; - export const frConfig = { ability: ability, abilityTriggers: abilityTriggers, @@ -44,6 +44,6 @@ export const frConfig = { trainerNames: trainerNames, tutorial: tutorial, weather: weather, + battleMessageUiHandler: battleMessageUiHandler, berry: berry, -} - +} \ No newline at end of file diff --git a/src/locales/it/battle-message-ui-handler.ts b/src/locales/it/battle-message-ui-handler.ts new file mode 100644 index 00000000000..346f856872c --- /dev/null +++ b/src/locales/it/battle-message-ui-handler.ts @@ -0,0 +1,10 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const battleMessageUiHandler: SimpleTranslationEntries = { + "ivBest": "Best", + "ivFantastic": "Fantastic", + "ivVeryGood": "Very Good", + "ivPrettyGood": "Pretty Good", + "ivDecent": "Decent", + "ivNoGood": "No Good", +} as const; \ No newline at end of file diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index 3d8d9b0e4b7..89d78304120 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -18,9 +18,9 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; - export const itConfig = { ability: ability, abilityTriggers: abilityTriggers, @@ -44,5 +44,6 @@ export const itConfig = { trainerNames: trainerNames, tutorial: tutorial, weather: weather, + battleMessageUiHandler: battleMessageUiHandler, berry: berry, -} +} \ No newline at end of file diff --git a/src/locales/pt_BR/battle-message-ui-handler.ts b/src/locales/pt_BR/battle-message-ui-handler.ts new file mode 100644 index 00000000000..346f856872c --- /dev/null +++ b/src/locales/pt_BR/battle-message-ui-handler.ts @@ -0,0 +1,10 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const battleMessageUiHandler: SimpleTranslationEntries = { + "ivBest": "Best", + "ivFantastic": "Fantastic", + "ivVeryGood": "Very Good", + "ivPrettyGood": "Pretty Good", + "ivDecent": "Decent", + "ivNoGood": "No Good", +} as const; \ No newline at end of file diff --git a/src/locales/zh_CN/battle-message-ui-handler.ts b/src/locales/zh_CN/battle-message-ui-handler.ts new file mode 100644 index 00000000000..346f856872c --- /dev/null +++ b/src/locales/zh_CN/battle-message-ui-handler.ts @@ -0,0 +1,10 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const battleMessageUiHandler: SimpleTranslationEntries = { + "ivBest": "Best", + "ivFantastic": "Fantastic", + "ivVeryGood": "Very Good", + "ivPrettyGood": "Pretty Good", + "ivDecent": "Decent", + "ivNoGood": "No Good", +} as const; \ No newline at end of file diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index 69f07a4f1a7..9c3a62f59f0 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -18,9 +18,9 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { weather } from "./weather"; +import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; - export const zhCnConfig = { ability: ability, abilityTriggers: abilityTriggers, @@ -44,5 +44,6 @@ export const zhCnConfig = { trainerNames: trainerNames, tutorial: tutorial, weather: weather, + battleMessageUiHandler: battleMessageUiHandler, berry: berry, -} +} \ No newline at end of file diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 30cc4bfcac2..5c9de28fe82 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -148,6 +148,7 @@ declare module 'i18next' { egg: SimpleTranslationEntries; weather: SimpleTranslationEntries; modifierType: ModifierTypeTranslationEntries; + battleMessageUiHandler: SimpleTranslationEntries; berry: BerryTranslationEntries; }; } @@ -159,4 +160,4 @@ export function getIsInitialized(): boolean { return isInitialized; } -let isInitialized = false; \ No newline at end of file +let isInitialized = false; diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index abcf04b7cc8..b7dccef52b5 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -7,6 +7,7 @@ import { getStatName, Stat } from "../data/pokemon-stat"; import { addWindow } from "./ui-theme"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import {Button} from "../enums/buttons"; +import i18next from '../plugins/i18n'; export default class BattleMessageUiHandler extends MessageUiHandler { private levelUpStatsContainer: Phaser.GameObjects.Container; @@ -234,20 +235,20 @@ export default class BattleMessageUiHandler extends MessageUiHandler { const textStyle: TextStyle = isBetter ? TextStyle.SUMMARY_GREEN : TextStyle.SUMMARY; const color = getTextColor(textStyle, false, uiTheme); return `[color=${color}][shadow=${getTextColor(textStyle, true, uiTheme)}]${text}[/shadow][/color]`; - }; +}; - if (value > 30) - return coloredText('Best', value > starterIvs[typeIv]); - if (value === 30) - return coloredText('Fantastic', value > starterIvs[typeIv]); - if (value > 20) - return coloredText('Very Good', value > starterIvs[typeIv]); - if (value > 10) - return coloredText('Pretty Good', value > starterIvs[typeIv]); - if (value > 0) - return coloredText('Decent', value > starterIvs[typeIv]); + if (value > 30) + return coloredText(i18next.t('battleMessageUiHandler:ivBest'), value > starterIvs[typeIv]); + if (value === 30) + return coloredText(i18next.t('battleMessageUiHandler:ivFantastic'), value > starterIvs[typeIv]); + if (value > 20) + return coloredText(i18next.t('battleMessageUiHandler:ivVeryGood'), value > starterIvs[typeIv]); + if (value > 10) + return coloredText(i18next.t('battleMessageUiHandler:ivPrettyGood'), value > starterIvs[typeIv]); + if (value > 0) + return coloredText(i18next.t('battleMessageUiHandler:ivDecent'), value > starterIvs[typeIv]); - return coloredText('No Good', value > starterIvs[typeIv]); + return coloredText(i18next.t('battleMessageUiHandler:ivNoGood'), value > starterIvs[typeIv]); } showNameText(name: string): void { From b0fd32b1a45034c603c8c4ee603f4eed0cf1c655 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Fri, 17 May 2024 12:22:58 +0200 Subject: [PATCH 15/21] Update French berry.ts (#1023) --- src/locales/fr/berry.ts | 46 ++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/locales/fr/berry.ts b/src/locales/fr/berry.ts index 8c8bc5ee280..dd6b387f4cc 100644 --- a/src/locales/fr/berry.ts +++ b/src/locales/fr/berry.ts @@ -2,47 +2,47 @@ import { BerryTranslationEntries } from "#app/plugins/i18n"; export const berry: BerryTranslationEntries = { "SITRUS": { - name: "Sitrus Berry", - effect: "Restores 25% HP if HP is below 50%", + name: "Baie Sitrus", + effect: "Restaure 25% des PV s’ils sont inférieurs à 50%", }, "LUM": { - name: "Lum Berry", - effect: "Cures any non-volatile status condition and confusion", + name: "Baie Prine", + effect: "Soigne tout problème de statut permanant et la confusion", }, "ENIGMA": { - name: "Enigma Berry", - effect: "Restores 25% HP if hit by a super effective move", + name: "Baie Enigma", + effect: "Restaure 25% des PV si touché par une capacité super efficace", }, "LIECHI": { - name: "Liechi Berry", - effect: "Raises Attack if HP is below 25%", + name: "Baie Lichii", + effect: "Augmente l’Attaque si les PV sont inférieurs à 25%", }, "GANLON": { - name: "Ganlon Berry", - effect: "Raises Defense if HP is below 25%", + name: "Baie Lingan", + effect: "Augmente la Défense si les PV sont inférieurs à 25%", }, "PETAYA": { - name: "Petaya Berry", - effect: "Raises Sp. Atk if HP is below 25%", + name: "Baie Pitaye", + effect: "Augmente l’Atq. Spé. si les PV sont inférieurs à 25%", }, "APICOT": { - name: "Apicot Berry", - effect: "Raises Sp. Def if HP is below 25%", + name: "Baie Abriko", + effect: "Augmente la Déf. Spé. si les PV sont inférieurs à 25%", }, "SALAC": { - name: "Salac Berry", - effect: "Raises Speed if HP is below 25%", + name: "Baie Sailak", + effect: "Augmente la Vitesse si les PV sont inférieurs à 25%", }, "LANSAT": { - name: "Lansat Berry", - effect: "Raises critical hit ratio if HP is below 25%", + name: "Baie Lansat", + effect: "Augmente le taux de coups critiques si les PV sont inférieurs à 25%", }, "STARF": { - name: "Starf Berry", - effect: "Sharply raises a random stat if HP is below 25%", + name: "Baie Frista", + effect: "Augmente énormément une statistique au hasard si les PV sont inférieurs à 25%", }, "LEPPA": { - name: "Leppa Berry", - effect: "Restores 10 PP to a move if its PP reaches 0", + name: "Baie Mepo", + effect: "Restaure 10 PP à une capacité dès que ses PP tombent à 0", }, -} as const; \ No newline at end of file +} as const; From 48c745deee1f2f2b58ad438ff95b949c7c898d4e Mon Sep 17 00:00:00 2001 From: Lugiad Date: Fri, 17 May 2024 12:23:23 +0200 Subject: [PATCH 16/21] Update French trainers.ts (#1020) --- src/locales/fr/trainers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/fr/trainers.ts b/src/locales/fr/trainers.ts index e5386288cb2..c73f0b1b1c5 100644 --- a/src/locales/fr/trainers.ts +++ b/src/locales/fr/trainers.ts @@ -35,7 +35,7 @@ export const trainerClasses: SimpleTranslationEntries = { "clerk": "Employé", "clerk_female": "Employée", "colleagues": "Collègues de Bureau", - "crush_kin": "Crush Kin", + "crush_kin": "Duo Baston", "cyclist": "Cycliste", "cyclist_female": "Cycliste", "cyclists": "Cyclistes", From 0c660f599d7f1105d5c7671abd8c2de52a20ef25 Mon Sep 17 00:00:00 2001 From: Somod1 <160222354+Somod1@users.noreply.github.com> Date: Fri, 17 May 2024 18:23:44 +0800 Subject: [PATCH 17/21] Add files via upload (#1022) --- src/locales/zh_CN/berry.ts | 94 +++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/src/locales/zh_CN/berry.ts b/src/locales/zh_CN/berry.ts index 8c8bc5ee280..08b16d58e68 100644 --- a/src/locales/zh_CN/berry.ts +++ b/src/locales/zh_CN/berry.ts @@ -1,48 +1,48 @@ -import { BerryTranslationEntries } from "#app/plugins/i18n"; - -export const berry: BerryTranslationEntries = { - "SITRUS": { - name: "Sitrus Berry", - effect: "Restores 25% HP if HP is below 50%", - }, - "LUM": { - name: "Lum Berry", - effect: "Cures any non-volatile status condition and confusion", - }, - "ENIGMA": { - name: "Enigma Berry", - effect: "Restores 25% HP if hit by a super effective move", - }, - "LIECHI": { - name: "Liechi Berry", - effect: "Raises Attack if HP is below 25%", - }, - "GANLON": { - name: "Ganlon Berry", - effect: "Raises Defense if HP is below 25%", - }, - "PETAYA": { - name: "Petaya Berry", - effect: "Raises Sp. Atk if HP is below 25%", - }, - "APICOT": { - name: "Apicot Berry", - effect: "Raises Sp. Def if HP is below 25%", - }, - "SALAC": { - name: "Salac Berry", - effect: "Raises Speed if HP is below 25%", - }, - "LANSAT": { - name: "Lansat Berry", - effect: "Raises critical hit ratio if HP is below 25%", - }, - "STARF": { - name: "Starf Berry", - effect: "Sharply raises a random stat if HP is below 25%", - }, - "LEPPA": { - name: "Leppa Berry", - effect: "Restores 10 PP to a move if its PP reaches 0", - }, +import { BerryTranslationEntries } from "#app/plugins/i18n"; + +export const berry: BerryTranslationEntries = { + "SITRUS": { + name: "文柚果", + effect: "HP低于50%时,回复最大HP的25%", + }, + "LUM": { + name: "木子果", + effect: "治愈任何异常状态和混乱状态", + }, + "ENIGMA": { + name: "谜芝果", + effect: "受到效果绝佳的招式攻击时,回复25%最大HP", + }, + "LIECHI": { + name: "枝荔果", + effect: "HP低于25%时,攻击提升一个等级", + }, + "GANLON": { + name: "龙睛果", + effect: "HP低于25%时,防御提升一个等级", + }, + "PETAYA": { + name: "龙火果", + effect: "HP低于25%时,特攻提升一个等级", + }, + "APICOT": { + name: "杏仔果", + effect: "HP低于25%时,特防提升一个等级", + }, + "SALAC": { + name: "沙鳞果", + effect: "HP低于25%时,速度提升一个等级", + }, + "LANSAT": { + name: "兰萨果", + effect: "HP低于25%时,击中要害率提升两个等级", + }, + "STARF": { + name: "星桃果", + effect: "HP低于25%时,提高随机一项能力两个等级", + }, + "LEPPA": { + name: "苹野果", + effect: "有招式的PP降到0时,恢复该招式10PP", + }, } as const; \ No newline at end of file From 4362d49e6b8ed80798e7a0b58755aa3b0a36e923 Mon Sep 17 00:00:00 2001 From: Calvin Keats Date: Fri, 17 May 2024 05:25:21 -0500 Subject: [PATCH 18/21] Use localization for damaging weather messages (#1017) --- src/data/weather.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/weather.ts b/src/data/weather.ts index eb30f22f36b..c8bd47fc12d 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -1,5 +1,5 @@ import { Biome } from "./enums/biome"; -import { getPokemonMessage } from "../messages"; +import { getPokemonMessage, getPokemonPrefix } from "../messages"; import Pokemon from "../field/pokemon"; import { Type } from "./type"; import Move, { AttackMove } from "./move"; @@ -172,9 +172,9 @@ export function getWeatherLapseMessage(weatherType: WeatherType): string { export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokemon): string { switch (weatherType) { case WeatherType.SANDSTORM: - return getPokemonMessage(pokemon, ' is buffeted\nby the sandstorm!'); + return i18next.t('weather:sandstormDamageMessage', {pokemonPrefix: getPokemonPrefix(pokemon), pokemonName: pokemon.name}); case WeatherType.HAIL: - return getPokemonMessage(pokemon, ' is pelted\nby the hail!'); + return i18next.t('weather:hailDamageMessage', {pokemonPrefix: getPokemonPrefix(pokemon), pokemonName: pokemon.name}); } return null; From edf3a6aa36cdbee56bc2a224b1af78d3a02624d0 Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+TempsRay@users.noreply.github.com> Date: Fri, 17 May 2024 06:28:22 -0400 Subject: [PATCH 19/21] Fix tinted caught icon false positive (#892) * Fix tinted caught icon false positive * Remove unused import * Rename and optimize * Block comment * use 3 equals --- src/ui/battle-info.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index f2e48911e07..88bc3230ce3 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -260,8 +260,23 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (!this.player) { const dexEntry = pokemon.scene.gameData.dexData[pokemon.species.speciesId]; this.ownedIcon.setVisible(!!dexEntry.caughtAttr); - const dexAttr = pokemon.getDexAttr(); - if ((dexEntry.caughtAttr & dexAttr) < dexAttr || !(pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr & Math.pow(2, pokemon.abilityIndex))) + const opponentPokemonDexAttr = pokemon.getDexAttr(); + + // Check if Player owns all genders and forms of the Pokemon + const missingDexAttrs = ((dexEntry.caughtAttr & opponentPokemonDexAttr) < opponentPokemonDexAttr); + + /** + * If the opposing Pokemon only has 1 normal ability and is using the hidden ability it should have the same behavior + * if it had 2 normal abilities. This code checks if that is the case and uses the correct opponent Pokemon abilityIndex (2) + * for calculations so it aligns with where the hidden ability is stored in the starter data's abilityAttr (4) + */ + const opponentPokemonOneNormalAbility = (pokemon.species.getAbilityCount() === 2); + const opponentPokemonAbilityIndex = (opponentPokemonOneNormalAbility && pokemon.abilityIndex === 1) ? 2 : pokemon.abilityIndex; + const opponentPokemonAbilityAttr = Math.pow(2, opponentPokemonAbilityIndex); + + const rootFormHasHiddenAbility = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr & opponentPokemonAbilityAttr; + + if (missingDexAttrs || !rootFormHasHiddenAbility) this.ownedIcon.setTint(0x808080); if (this.boss) From 10437142b60b1049b4abd65f6d6d6b06afb1210c Mon Sep 17 00:00:00 2001 From: William Burleson <72857839+Admiral-Billy@users.noreply.github.com> Date: Fri, 17 May 2024 06:51:48 -0400 Subject: [PATCH 20/21] Fix daily run freeze (#1025) --- src/phases.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/phases.ts b/src/phases.ts index 91e098edf1f..1137c85afa6 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -3545,10 +3545,12 @@ export class GameOverModifierRewardPhase extends ModifierRewardPhase { this.scene.addModifier(newModifier).then(() => { this.scene.playSound('level_up_fanfare'); this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.fadeIn(250).then(() => { this.scene.ui.showText(`You received\n${newModifier.type.name}!`, null, () => { this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); resolve(); }, null, true, 1500); + }); }); }) } From bfa12fd48dd17171917fc907ba62ee9356263adc Mon Sep 17 00:00:00 2001 From: Calvin Keats Date: Fri, 17 May 2024 06:54:51 -0500 Subject: [PATCH 21/21] Update ETHER and similar items to use total max PP instead of base PP (#1014) --- src/modifier/modifier-type.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 50bf2f78a0c..1e21af58564 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1194,11 +1194,11 @@ const modifierPool: ModifierPool = { return thresholdPartyMemberCount; }, 3), new WeightedModifierType(modifierTypes.ETHER, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMove().pp - m.ppUsed) <= 5).length).length, 3); + const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMovePp() - m.ppUsed) <= 5).length).length, 3); return thresholdPartyMemberCount * 3; }, 9), new WeightedModifierType(modifierTypes.MAX_ETHER, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMove().pp - m.ppUsed) <= 5).length).length, 3); + const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMovePp() - m.ppUsed) <= 5).length).length, 3); return thresholdPartyMemberCount; }, 3), new WeightedModifierType(modifierTypes.LURE, 2), @@ -1237,11 +1237,11 @@ const modifierPool: ModifierPool = { return thresholdPartyMemberCount; }, 3), new WeightedModifierType(modifierTypes.ELIXIR, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMove().pp - m.ppUsed) <= 5).length).length, 3); + const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMovePp() - m.ppUsed) <= 5).length).length, 3); return thresholdPartyMemberCount * 3; }, 9), new WeightedModifierType(modifierTypes.MAX_ELIXIR, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMove().pp - m.ppUsed) <= 5).length).length, 3); + const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMovePp() - m.ppUsed) <= 5).length).length, 3); return thresholdPartyMemberCount; }, 3), new WeightedModifierType(modifierTypes.DIRE_HIT, 4),