This commit is contained in:
AJ Fontaine 2024-09-28 16:32:22 -04:00
commit 9baa304ca5
33 changed files with 241 additions and 55 deletions

2
.github/FUNDING.yml vendored
View File

@ -1 +1 @@
github: patapancakes
github: pagefaultgames

View File

@ -3091,11 +3091,6 @@ export default class BattleScene extends SceneBase {
private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number, sessionDataEncounterType?: MysteryEncounterType): boolean {
const [lowestMysteryEncounterWave, highestMysteryEncounterWave] = this.gameMode.getMysteryEncounterLegalWaves();
if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave) {
// If ME type is already defined in session data, no need to roll RNG check
if (!isNullOrUndefined(sessionDataEncounterType)) {
return true;
}
// Base spawn weight is BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT/256, and increases by WEIGHT_INCREMENT_ON_SPAWN_MISS/256 for each missed attempt at spawning an encounter on a valid floor
const sessionEncounterRate = this.mysteryEncounterSaveData.encounterSpawnChance;
const encounteredEvents = this.mysteryEncounterSaveData.encounteredEvents;

View File

@ -81,7 +81,7 @@ export const speciesEggMoves = {
[Species.LEDYBA]: [ Moves.POLLEN_PUFF, Moves.THIEF, Moves.PARTING_SHOT, Moves.SPORE ],
[Species.SPINARAK]: [ Moves.PARTING_SHOT, Moves.ATTACK_ORDER, Moves.GASTRO_ACID, Moves.STRENGTH_SAP ],
[Species.CHINCHOU]: [ Moves.THUNDERCLAP, Moves.BOUNCY_BUBBLE, Moves.THUNDER_CAGE, Moves.TAIL_GLOW ],
[Species.PICHU]: [ Moves.MOONBLAST, Moves.WAVE_CRASH, Moves.AIR_SLASH, Moves.AURA_WHEEL ],
[Species.PICHU]: [ Moves.MOONBLAST, Moves.TRIPLE_AXEL, Moves.FIERY_DANCE, Moves.AURA_WHEEL ],
[Species.CLEFFA]: [ Moves.CALM_MIND, Moves.EARTH_POWER, Moves.WISH, Moves.LIGHT_OF_RUIN ],
[Species.IGGLYBUFF]: [ Moves.DRAIN_PUNCH, Moves.GRAV_APPLE, Moves.SOFT_BOILED, Moves.EXTREME_SPEED ],
[Species.TOGEPI]: [ Moves.SCORCHING_SANDS, Moves.ROOST, Moves.RELIC_SONG, Moves.FIERY_DANCE ],
@ -195,7 +195,7 @@ export const speciesEggMoves = {
[Species.REGISTEEL]: [ Moves.BODY_PRESS, Moves.SIZZLY_SLIDE, Moves.RECOVER, Moves.GIGATON_HAMMER ],
[Species.LATIAS]: [ Moves.CORE_ENFORCER, Moves.FUSION_FLARE, Moves.SPARKLY_SWIRL, Moves.MYSTICAL_POWER ],
[Species.LATIOS]: [ Moves.CORE_ENFORCER, Moves.BLUE_FLARE, Moves.NASTY_PLOT, Moves.TACHYON_CUTTER ],
[Species.KYOGRE]: [ Moves.RECOVER, Moves.HURRICANE, Moves.FLIP_TURN, Moves.WILDBOLT_STORM ],
[Species.KYOGRE]: [ Moves.RECOVER, Moves.HURRICANE, Moves.FREEZY_FROST, Moves.WILDBOLT_STORM ],
[Species.GROUDON]: [ Moves.STONE_AXE, Moves.SOLAR_BLADE, Moves.MORNING_SUN, Moves.SACRED_FIRE ],
[Species.RAYQUAZA]: [ Moves.V_CREATE, Moves.DRAGON_DARTS, Moves.CORE_ENFORCER, Moves.OBLIVION_WING ],
[Species.JIRACHI]: [ Moves.TACHYON_CUTTER, Moves.TRIPLE_ARROWS, Moves.ROCK_SLIDE, Moves.SHELL_SMASH ],

View File

@ -5226,6 +5226,9 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
*/
const switchOutTarget = this.selfSwitch ? user : target;
if (switchOutTarget instanceof PlayerPokemon) {
if (switchOutTarget.scene.getParty().filter((p) => p.isAllowedInBattle() && !p.isOnField()).length < 1) {
return false;
}
switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH);
if (switchOutTarget.hp > 0) {
@ -5234,6 +5237,9 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
}
return false;
} else if (user.scene.currentBattle.battleType !== BattleType.WILD) {
if (switchOutTarget.scene.getEnemyParty().filter((p) => p.isAllowedInBattle() && !p.isOnField()).length < 1) {
return false;
}
// Switch out logic for trainer battles
switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH);
@ -5244,6 +5250,9 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
false, false), MoveEndPhase);
}
} else {
if (user.scene.currentBattle.waveIndex % 10 === 0) {
return false;
}
// Switch out logic for everything else (eg: WILD battles)
switchOutTarget.leaveField(false);

View File

@ -558,6 +558,10 @@ function onGameOver(scene: BattleScene) {
// Revert BGM
scene.playBgm(scene.arena.bgm);
// Clear any leftover battle phases
scene.clearPhaseQueue();
scene.clearPhaseQueueSplice();
// Return enemy Pokemon
const pokemon = scene.getEnemyPokemon();
if (pokemon) {

View File

@ -952,32 +952,35 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const baseStats = this.calculateBaseStats();
// Using base stats, calculate and store stats one by one
for (const s of PERMANENT_STATS) {
let value = Math.floor(((2 * baseStats[s] + this.ivs[s]) * this.level) * 0.01);
const statHolder = new Utils.IntegerHolder(Math.floor(((2 * baseStats[s] + this.ivs[s]) * this.level) * 0.01));
if (s === Stat.HP) {
value = value + this.level + 10;
statHolder.value = statHolder.value + this.level + 10;
this.scene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, s, statHolder);
if (this.hasAbility(Abilities.WONDER_GUARD, false, true)) {
value = 1;
statHolder.value = 1;
}
if (this.hp > value || this.hp === undefined) {
this.hp = value;
if (this.hp > statHolder.value || this.hp === undefined) {
this.hp = statHolder.value;
} else if (this.hp) {
const lastMaxHp = this.getMaxHp();
if (lastMaxHp && value > lastMaxHp) {
this.hp += value - lastMaxHp;
if (lastMaxHp && statHolder.value > lastMaxHp) {
this.hp += statHolder.value - lastMaxHp;
}
}
} else {
value += 5;
statHolder.value += 5;
const natureStatMultiplier = new Utils.NumberHolder(getNatureStatMultiplier(this.getNature(), s));
this.scene.applyModifier(PokemonNatureWeightModifier, this.isPlayer(), this, natureStatMultiplier);
if (natureStatMultiplier.value !== 1) {
value = Math.max(Math[natureStatMultiplier.value > 1 ? "ceil" : "floor"](value * natureStatMultiplier.value), 1);
statHolder.value = Math.max(Math[natureStatMultiplier.value > 1 ? "ceil" : "floor"](statHolder.value * natureStatMultiplier.value), 1);
}
this.scene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, s, statHolder);
}
this.setStat(s, value);
statHolder.value = Utils.clampInt(statHolder.value, 1, Number.MAX_SAFE_INTEGER);
this.setStat(s, statHolder.value);
}
this.scene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, this.stats);
}
calculateBaseStats(): number[] {

View File

@ -75,5 +75,5 @@
"substituteOnAdd": "Ein Delegator von {{pokemonNameWithAffix}} ist erschienen!",
"substituteOnHit": "Der Delegator steckt den Schlag für {{pokemonNameWithAffix}} ein!",
"substituteOnRemove": "Der Delegator von {{pokemonNameWithAffix}} hört auf zu wirken!",
"autotomizeOnAdd": "{{pokemonNameWIthAffix}} ist leichter geworden!"
"autotomizeOnAdd": "{{pokemonNameWithAffix}} ist leichter geworden!"
}

View File

@ -71,5 +71,5 @@
"safeguard": "{{targetName}} is protected by Safeguard!",
"substituteOnOverlap": "{{pokemonName}} already\nhas a substitute!",
"substituteNotEnoughHp": "But it does not have enough HP\nleft to make a substitute!",
"afterYou": "{{pokemonName}} took the kind offer!"
"afterYou": "{{targetName}} took the kind offer!"
}

View File

@ -358,6 +358,10 @@
"name": "Llamasfera",
"description": "Extraña esfera que causa quemaduras a quien la usa en combate."
},
"EVOLUTION_TRACKER_GIMMIGHOUL": {
"name": "Tesoros",
"description": "¡A este Pokémon le encantan los tesoros! ¡Sigue coleccionandólos y tal vez pase algo!"
},
"BATON": {
"name": "Testigo",
"description": "Permite pasar los efectos al cambiar de Pokémon, también evita las trampas."
@ -495,6 +499,22 @@
"TART_APPLE": "Manzana ácida",
"STRAWBERRY_SWEET": "Confite fresa",
"UNREMARKABLE_TEACUP": "Cuenco mediocre",
"UPGRADE": "Mejora",
"DUBIOUS_DISC": "Disco Extraño",
"DRAGON_SCALE": "Escama Dragón",
"PRISM_SCALE": "Escama Bella",
"RAZOR_CLAW": "Garra Afilada",
"RAZOR_FANG": "Colmillo Agudo",
"REAPER_CLOTH": "Tela Terrible",
"ELECTIRIZER": "Electrizador",
"MAGMARIZER": "Magmatizador",
"PROTECTOR": "Protector",
"SACHET": "Saquito Fragante",
"WHIPPED_DREAM": "Dulce de Nata",
"LEADERS_CREST": "Distintivo de Líder",
"SUN_FLUTE": "Flauta Solar",
"MOON_FLUTE": "Flauta Lunar",
"CHIPPED_POT": "Tetera rota",
"BLACK_AUGURITE": "Mineral negro",
"GALARICA_CUFF": "Brazal galanuez",

View File

@ -67,5 +67,5 @@
"swapArenaTags": "¡{{pokemonName}} ha intercambiado los efectos del terreno de combate!",
"exposedMove": "¡{{pokemonName}} ha identificado\n{{targetPokemonName}}!",
"safeguard": "¡{{targetName}} está protegido por Velo Sagrado!",
"afterYou": "¡{{pokemonName}} ha decidido aprovechar la oportunidad!"
"afterYou": "¡{{targetName}} ha decidido aprovechar la oportunidad!"
}

View File

@ -240,6 +240,8 @@
"TOXIC_ORB": { "name": "Orbe Toxique", "description": "Empoisonne gravement son porteur à la fin du tour sil na pas déjà de problème de statut." },
"FLAME_ORB": { "name": "Orbe Flamme", "description": "Brule son porteur à la fin du tour sil na pas déjà de problème de statut." },
"EVOLUTION_TRACKER_GIMMIGHOUL": { "name": "Trésors", "description": "Ce Pokémon adore les trésors ! Ramassez-en le plus possible et voyez ce quil se passe !"},
"BATON": { "name": "Témoin", "description": "Permet de transmettre les effets en cas de changement de Pokémon. Ignore les pièges." },
"SHINY_CHARM": { "name": "Charme Chroma", "description": "Augmente énormément les chances de rencontrer un Pokémon sauvage chromatique." },
@ -330,6 +332,21 @@
"TART_APPLE": "Pomme Acidulée",
"STRAWBERRY_SWEET": "Fraise en Sucre",
"UNREMARKABLE_TEACUP": "Bol Médiocre",
"UPGRADE": "Améliorator",
"DUBIOUS_DISC": "CD Douteux",
"DRAGON_SCALE": "Écaille Draco",
"PRISM_SCALE": "BelÉcaille",
"RAZOR_CLAW": "Griffe Rasoir",
"RAZOR_FANG": "Croc Rasoir",
"REAPER_CLOTH": "Tissu Fauche",
"ELECTIRIZER": "Électriseur",
"MAGMARIZER": "Magmariseur",
"PROTECTOR": "Protecteur",
"SACHET": "Sachet Senteur",
"WHIPPED_DREAM": "Chantibonbon",
"LEADERS_CREST": "Emblème du Général",
"SUN_FLUTE": "Flute du Soleil",
"MOON_FLUTE": "Flute de la Lune",
"CHIPPED_POT": "Théière Ébréchée",
"BLACK_AUGURITE": "Obsidienne",

View File

@ -71,5 +71,5 @@
"safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !",
"substituteOnOverlap": "{{pokemonName}} a déjà\nun clone !",
"substituteNotEnoughHp": "Mais il est trop faible\npour créer un clone !",
"afterYou": "{{pokemonName}} accepte\navec joie !"
"afterYou": "{{targetName}} accepte\navec joie !"
}

View File

@ -28,7 +28,7 @@
"select_prompt": "Choisissez un objet à donner.",
"invalid_selection": "Ce Pokémon ne porte pas ce genre dobjet.",
"selected": "Vous remettez lobjet {{selectedItem}} au Dresseur.",
"selected_dialogue": "Sérieux ? {{selectedItem}}, comme ça en cadeau ?\nCest très générieux !$En guise de ma reconnaissance, laisse-moi\nte faire un cadeau un peu spécial !$Il est dans ma famille depusi des générations, et ça me ferait plaisir de te loffrir !"
"selected_dialogue": "Sérieux ? {{selectedItem}}, comme ça en cadeau ?\nCest très générieux !$En guise de ma reconnaissance, laisse-moi\nte faire un cadeau un peu spécial !$Il est dans ma famille depuis des générations, et ça me ferait plaisir de te loffrir !"
}
},
"battle_won": "Tes connaissances et tes capacités ont totalement exploité nos faiblesses !$En remerciement de cette leçon, permets-moi\ndapprendre une capacité Insecte à un de tes Pokémon !",

View File

@ -1,7 +1,7 @@
{
"intro": "Vous tombez sur du matériel dentrainement.",
"title": "Session dentrainement",
"description": "Ce matériel semble pouvoir être utilisé pour entrainer un membre de votre équipe ! Il existe plusieurs moyens avec lesquels vous pourriez entrainer un Pokémon, comme @[TOOLTIP_TITLE]{en le faisant combattre et vaincre le reste de votre équipe}.",
"description": "Ce matériel semble pouvoir être utilisé pour entrainer un membre de votre équipe ! Il existe plusieurs moyens avec lesquels vous pourriez entrainer un Pokémon, comme @[TOOLTIP_TITLE]{en le combattant et le vainquant avec le reste de votre équipe}.",
"query": "Quel entrainement choisir ?",
"invalid_selection": "Le Pokémon doit être en bonne santé.",
"option": {

View File

@ -14,13 +14,13 @@
"label": "Le nourrir",
"disabled_tooltip": "Vous avez besoin de 4 Baies pour choisir cette option",
"tooltip": "(-) Donner 4 Baies\n(+) Le {{enemyPokemon}} vous apprécie",
"selected": "Vous lancer quelques Baies\nau {{enemyPokemon}} !$Il les engloutit avec joie !$Le {{enemyPokemon}} veut se joindre\nà votre équipe !"
"selected": "Vous lancez quelques Baies\nau {{enemyPokemon}} !$Il les engloutit avec joie !$Le {{enemyPokemon}} veut se joindre\nà votre équipe !"
},
"3": {
"label": "Devenir amis",
"disabled_tooltip": "Votre Pokémon doit connaitre certaines capacités pour choisir cette option",
"tooltip": "(+) {{option3PrimaryName}} utilise {{option3PrimaryMove}}\n(+) Le {{enemyPokemon}} vous apprécie",
"selected": "Votre {{option3PrimaryName}} utilise {{option3PrimaryMove}} pour charmer le {{enemyPokemon}} !$The {{enemyPokemon}} veut se joindre\nà votre équipe !"
"selected": "Votre {{option3PrimaryName}} utilise {{option3PrimaryMove}} pour charmer le {{enemyPokemon}} !$Le {{enemyPokemon}} veut se joindre\nà votre équipe !"
}
}
}

View File

@ -11,7 +11,7 @@
"expGainsSpeed": "Vit. barre dExp",
"expPartyDisplay": "Afficher Exp équipe",
"skipSeenDialogues": "Passer dialogues connus",
"eggSkip": "Animation déclosion",
"eggSkip": "Passer les éclosions",
"never": "Jamais",
"always": "Toujours",
"ask": "Demander",

View File

@ -358,6 +358,10 @@
"name": "Fiammosfera",
"description": "Sfera bizzarra che procura una scottatura a chi lha con sé in una lotta."
},
"EVOLUTION_TRACKER_GIMMIGHOUL": {
"name": "Tesori",
"description": "Questo Pokémon adora i tesori! Continua a collezionare i tesori e potrebbe accadere qualcosa!"
},
"BATON": {
"name": "Staffetta",
"description": "Permette di trasmettere gli effetti quando si cambia Pokémon, aggirando anche le trappole."
@ -495,6 +499,22 @@
"TART_APPLE": "Aspropomo",
"STRAWBERRY_SWEET": "Bonbonfragola",
"UNREMARKABLE_TEACUP": "Tazza dozzinale",
"UPGRADE": "Upgrade",
"DUBIOUS_DISC": "Dubbiodisco",
"DRAGON_SCALE": "Squama drago",
"PRISM_SCALE": "Squama bella",
"RAZOR_CLAW": "Affilartiglio",
"RAZOR_FANG": "Affilodente",
"REAPER_CLOTH": "Terrorpanno",
"ELECTIRIZER": "Elettritore",
"MAGMARIZER": "Magmatore",
"PROTECTOR": "Copertura",
"SACHET": "Bustina aromi",
"WHIPPED_DREAM": "Dolcespuma",
"LEADERS_CREST": "Simbolo del capo",
"SUN_FLUTE": "Flauto solare",
"MOON_FLUTE": "Flauto lunare",
"CHIPPED_POT": "Teiera crepata",
"BLACK_AUGURITE": "Augite nera",
"GALARICA_CUFF": "Fascia Galarnoce",

View File

@ -68,5 +68,5 @@
"exposedMove": "{{pokemonName}} ha identificato\n{{targetPokemonName}}!",
"chillyReception": "{{pokemonName}} sta per fare una battuta!",
"safeguard": "Salvaguardia protegge {{targetName}}!",
"afterYou": "{{pokemonName}} approfitta della cortesia!"
"afterYou": "{{targetName}} approfitta della cortesia!"
}

View File

@ -240,6 +240,11 @@
"TOXIC_ORB": { "name": "どくどくだま", "description": "触ると 毒をだす 不思議な玉。\n持たせると 戦闘中に 猛毒の状態に なる" },
"FLAME_ORB": { "name": "かえんだま", "description": "触ると 熱をだす 不思議な玉。\n持たせると 戦闘中に やけどの状態に なる。" },
"EVOLUTION_TRACKER_GIMMIGHOUL": {
"name": "宝物",
"description": "このポケモンは 宝物が 大好き! 宝物を 集め続けると 良いことが 起こる かもしれません!"
},
"BATON": { "name": "バトン", "description": "持たせると 入れ替えるとき 控えのポケモンが\n能力変化を 受けつげる 逃げられなくする 技や 特性も 回避する" },
"SHINY_CHARM": { "name": "ひかるおまもり", "description": "色違いの ポケモンと 大きく 出会いやすくなる" },
@ -330,6 +335,21 @@
"TART_APPLE": "すっぱいりんご",
"STRAWBERRY_SWEET": "いちごアメざいく",
"UNREMARKABLE_TEACUP": "ボンサクのちゃわん",
"UPGRADE": "アップグレード",
"DUBIOUS_DISC": "あやしいパッチ",
"DRAGON_SCALE": "りゅうのウロコ",
"PRISM_SCALE": "きれいなウロコ",
"RAZOR_CLAW": "するどいツメ",
"RAZOR_FANG": "するどいキバ",
"REAPER_CLOTH": "れいかいのぬの",
"ELECTIRIZER": "エレキブースター",
"MAGMARIZER": "マグマブースター",
"PROTECTOR": "プロテクター",
"SACHET": "においぶくろ",
"WHIPPED_DREAM": "ホイップポップ",
"LEADERS_CREST": "かしらのしるし",
"SUN_FLUTE": "たいようのふえ",
"MOON_FLUTE": "つきのふえ",
"CHIPPED_POT": "かけたポット",
"BLACK_AUGURITE": "くろのきせき",

View File

@ -68,5 +68,5 @@
"chillyReception": "{{pokemonName}}は\n寒い ギャグを かました",
"swapArenaTags": "{{pokemonName}}は\nお互いの 場の 効果を 入れ替えた",
"exposedMove": "{{pokemonName}}は {{targetPokemonName}}の\n正体を 見破った",
"afterYou": "{{pokemonName}}は\nお言葉に 甘えることにした"
"afterYou": "{{targetName}}は\nお言葉に 甘えることにした"
}

View File

@ -358,9 +358,13 @@
"name": "화염구슬",
"description": "이 도구를 지닌 포켓몬은 턴이 끝나는 시점에 상태이상에 걸리지 않았다면 화상 상태가 된다."
},
"EVOLUTION_TRACKER_GIMMIGHOUL": {
"name": "보물",
"description": "이 포켓몬은 보물을 좋아한다. 보물을 모으다 보면 어떤 일이 일어날 지도 모른다!"
},
"BATON": {
"name": "배턴",
"description": "포켓몬을 교체할 때 효과를 넘겨줄 수 있으며, 함정의 영향을 받지 않게 함"
"description": "포켓몬을 교체할 때 효과를 넘겨줄 수 있으며, 함정의 영향을 받지 않게 한다."
},
"SHINY_CHARM": {
"name": "빛나는부적",
@ -495,6 +499,22 @@
"TART_APPLE": "새콤한사과",
"STRAWBERRY_SWEET": "딸기사탕공예",
"UNREMARKABLE_TEACUP": "범작찻잔",
"UPGRADE": "업그레이드",
"DUBIOUS_DISC": "괴상한패치",
"DRAGON_SCALE": "용의비늘",
"PRISM_SCALE": "고운비늘",
"RAZOR_CLAW": "예리한손톱",
"RAZOR_FANG": "예리한이빨",
"REAPER_CLOTH": "영계의천",
"ELECTIRIZER": "에레키부스터",
"MAGMARIZER": "마그마부스터",
"PROTECTOR": "프로텍터",
"SACHET": "향기주머니",
"WHIPPED_DREAM": "휘핑크림",
"LEADERS_CREST": "대장의징표",
"SUN_FLUTE": "태양의피리",
"MOON_FLUTE": "달의피리",
"CHIPPED_POT": "이빠진포트",
"BLACK_AUGURITE": "검은휘석",
"GALARICA_CUFF": "가라두구팔찌",

View File

@ -69,5 +69,5 @@
"chillyReception": "{{pokemonName}}[[는]] 썰렁한 개그를 선보였다!",
"exposedMove": "{{pokemonName}}[[는]]\n{{targetPokemonName}}의 정체를 꿰뚫어 보았다!",
"safeguard": "{{targetName}}[[는]] 신비의 베일이 지켜 주고 있다!",
"afterYou": "{{pokemonName}}[[는]]\n배려를 받아들이기로 했다!"
"afterYou": "{{targetName}}[[는]]\n배려를 받아들이기로 했다!"
}

View File

@ -358,6 +358,10 @@
"name": "Esfera da Chama",
"description": "Uma esfera estranha que aquece quando tocada e queima quem a segurar."
},
"EVOLUTION_TRACKER_GIMMIGHOUL": {
"name": "Treasures",
"description": "This Pokémon loves treasure! Keep collecting treasure and something might happen!"
},
"BATON": {
"name": "Bastão",
"description": "Permite passar mudanças de atributo ao trocar Pokémon, ignorando armadilhas."
@ -507,6 +511,22 @@
"TART_APPLE": "Maçã Azeda",
"STRAWBERRY_SWEET": "Doce de Morango",
"UNREMARKABLE_TEACUP": "Xícara Comum",
"UPGRADE": "Melhora",
"DUBIOUS_DISC": "Dubious Disc",
"DRAGON_SCALE": "Escama de Dragão",
"PRISM_SCALE": "Prism Scale",
"RAZOR_CLAW": "Garra de Navalha",
"RAZOR_FANG": "Presa Afiada",
"REAPER_CLOTH": "Capa do Ceifador",
"ELECTIRIZER": "Electirizer",
"MAGMARIZER": "Magmarizer",
"PROTECTOR": "Protector",
"SACHET": "Sachet",
"WHIPPED_DREAM": "Whipped Dream",
"LEADERS_CREST": "Leader's Crest",
"SUN_FLUTE": "Sun Flute",
"MOON_FLUTE": "Moon Flute",
"CHIPPED_POT": "Pote Lascado",
"BLACK_AUGURITE": "Mineral Negro",
"GALARICA_CUFF": "Bracelete de Galar",

View File

@ -64,5 +64,5 @@
"chillyReception": "{{pokemonName}} está prestes a contar uma piada gelada!",
"exposedMove": "{{pokemonName}} identificou\n{{targetPokemonName}}!",
"safeguard": "{{targetName}} está protegido por Safeguard!",
"afterYou": "{{pokemonName}} aceitou a gentil oferta!"
"afterYou": "{{targetName}} aceitou a gentil oferta!"
}

View File

@ -358,6 +358,10 @@
"name": "火焰宝珠",
"description": "触碰后会放出热量的神奇宝珠。\n携带后在战斗时会变成灼伤状态。"
},
"EVOLUTION_TRACKER_GIMMIGHOUL": {
"name": "金子宝物",
"description": "这个宝可梦最爱金币!多收集点金币的话会发生什么呢?"
},
"BATON": {
"name": "接力棒",
"description": "允许在切换宝可梦时保留能力变化, 对陷阱\n同样生效。"
@ -495,6 +499,22 @@
"TART_APPLE": "酸酸苹果",
"STRAWBERRY_SWEET": "草莓糖饰",
"UNREMARKABLE_TEACUP": "凡作茶碗",
"UPGRADE": "升级数据",
"DUBIOUS_DISC": "可疑补丁",
"DRAGON_SCALE": "龙之鳞片",
"PRISM_SCALE": "美丽鳞片",
"RAZOR_CLAW": "锐利之爪",
"RAZOR_FANG": "锐利之牙",
"REAPER_CLOTH": "灵界之布",
"ELECTIRIZER": "电力增幅器",
"MAGMARIZER": "熔岩增幅器",
"PROTECTOR": "护具",
"SACHET": "香袋",
"WHIPPED_DREAM": "泡沫奶油",
"LEADERS_CREST": "头领凭证",
"SUN_FLUTE": "太阳之笛",
"MOON_FLUTE": "月亮之笛",
"CHIPPED_POT": "缺损的茶壶",
"BLACK_AUGURITE": "黑奇石",
"GALARICA_CUFF": "伽勒豆蔻手环",

View File

@ -68,5 +68,5 @@
"chillyReception": "{{pokemonName}}\n说出了冷笑话",
"exposedMove": "{{pokemonName}}识破了\n{{targetPokemonName}}的原型!",
"safeguard": "{{targetName}}\n正受到神秘之幕的保护",
"afterYou": "{{pokemonName}}\n接受了对手的好意"
"afterYou": "{{targetName}}\n接受了对手的好意"
}

View File

@ -358,6 +358,10 @@
"name": "火焰寶珠",
"description": "觸碰後會放出熱量的神奇寶珠。\n攜帶後在戰鬥時會變成灼傷狀態。"
},
"EVOLUTION_TRACKER_GIMMIGHOUL": {
"name": "金子寶物",
"description": "這個小精靈愛金子! 繼續挑金子然後誰知道什麼會發生!"
},
"BATON": {
"name": "接力棒",
"description": "允許在切換寶可夢時保留能力變化, 對陷阱\n同樣生效。"
@ -495,6 +499,22 @@
"TART_APPLE": "酸酸蘋果",
"STRAWBERRY_SWEET": "草莓糖飾",
"UNREMARKABLE_TEACUP": "凡作茶碗",
"UPGRADE": "升級資料",
"DUBIOUS_DISC": "可疑修正檔",
"DRAGON_SCALE": "龍之鱗片",
"PRISM_SCALE": "美麗鱗片",
"RAZOR_CLAW": "銳利之爪",
"RAZOR_FANG": "銳利之牙",
"REAPER_CLOTH": "靈界之布",
"ELECTIRIZER": "電力增幅器",
"MAGMARIZER": "熔岩增幅器",
"PROTECTOR": "護具",
"SACHET": "香袋",
"WHIPPED_DREAM": "泡沫奶油",
"LEADERS_CREST": "頭領憑證",
"SUN_FLUTE": "太陽之笛",
"MOON_FLUTE": "月亮之笛",
"CHIPPED_POT": "缺損的茶壺",
"BLACK_AUGURITE": "黑奇石",
"GALARICA_CUFF": "伽勒豆蔻手環",

View File

@ -68,5 +68,5 @@
"chillyReception": "{{pokemonName}}\n說了冷笑話",
"exposedMove": "{{pokemonName}}識破了\n{{targetPokemonName}}的原形!",
"safeguard": "{{targetName}}\n正受到神秘之幕的保護",
"afterYou": "{{pokemonName}}\n接受了對手的好意"
"afterYou": "{{targetName}}\n接受了對手的好意"
}

View File

@ -1017,26 +1017,26 @@ export class PokemonIncrementingStatModifier extends PokemonHeldItemModifier {
}
shouldApply(args: any[]): boolean {
return super.shouldApply(args) && args.length === 2 && args[1] instanceof Array;
return super.shouldApply(args) && args.length === 3 && args[2] instanceof Utils.IntegerHolder;
}
apply(args: any[]): boolean {
// Modifies the passed in stats[] array by +1 per stack for HP, +2 per stack for other stats
// Modifies the passed in stat integer holder by +1 per stack for HP, +2 per stack for other stats
// If the Macho Brace is at max stacks (50), adds additional 5% to total HP and 10% to other stats
const targetToApply = args[0] as Pokemon;
const isHp = args[1] === Stat.HP;
const statHolder = args[2] as Utils.IntegerHolder;
args[1].forEach((v, i) => {
const isHp = i === 0;
// Doesn't modify HP if holder has Wonder Guard
if (!isHp || !targetToApply.hasAbility(Abilities.WONDER_GUARD)) {
let mult = 1;
if (this.stackCount === this.getMaxHeldItemCount()) {
mult = isHp ? 1.05 : 1.1;
}
const newVal = Math.floor((v + this.stackCount * (isHp ? 1 : 2)) * mult);
args[1][i] = Math.min(Math.max(newVal, 1), 999999);
if (isHp) {
statHolder.value += this.stackCount;
if (this.stackCount === this.getMaxHeldItemCount()) {
statHolder.value = Math.floor(statHolder.value * 1.05);
}
});
} else {
statHolder.value += 2 * this.stackCount;
if (this.stackCount === this.getMaxHeldItemCount()) {
statHolder.value = Math.floor(statHolder.value * 1.1);
}
}
return true;
}
@ -2604,7 +2604,7 @@ export class HealShopCostModifier extends PersistentModifier {
constructor(type: ModifierType, shopMultiplier: number, stackCount?: integer) {
super(type, stackCount);
this.shopMultiplier = shopMultiplier;
this.shopMultiplier = shopMultiplier ?? 2.5;
}
match(modifier: Modifier): boolean {
@ -2616,11 +2616,16 @@ export class HealShopCostModifier extends PersistentModifier {
}
apply(args: any[]): boolean {
(args[0] as Utils.IntegerHolder).value *= this.shopMultiplier;
const moneyCost = args[0] as Utils.NumberHolder;
moneyCost.value = Math.floor(moneyCost.value * this.shopMultiplier);
return true;
}
getArgs(): any[] {
return super.getArgs().concat(this.shopMultiplier);
}
getMaxStackCount(scene: BattleScene): integer {
return 1;
}

View File

@ -238,7 +238,7 @@ export class GameOverPhase extends BattlePhase {
enemyModifiers: this.scene.findModifiers(() => true, false).map(m => new PersistentModifierData(m, false)),
arena: new ArenaData(this.scene.arena),
pokeballCounts: this.scene.pokeballCounts,
money: this.scene.money,
money: Math.floor(this.scene.money),
score: this.scene.score,
waveIndex: this.scene.currentBattle.waveIndex,
battleType: this.scene.currentBattle.battleType,

View File

@ -25,6 +25,7 @@ import { GameOverPhase } from "#app/phases/game-over-phase";
import { SwitchPhase } from "#app/phases/switch-phase";
import { SeenEncounterData } from "#app/data/mystery-encounters/mystery-encounter-save-data";
import { SwitchType } from "#enums/switch-type";
import { BattlerTagType } from "#enums/battler-tag-type";
/**
* Will handle (in order):
@ -218,9 +219,17 @@ export class MysteryEncounterBattleStartCleanupPhase extends Phase {
start() {
super.start();
// Lapse any residual flinches/endures but ignore all other turn-end battle tags
const includedLapseTags = [BattlerTagType.FLINCHED, BattlerTagType.ENDURING];
const field = this.scene.getField(true).filter(p => p.summonData);
field.forEach(pokemon => {
pokemon.lapseTags(BattlerTagLapseType.TURN_END);
const tags = pokemon.summonData.tags;
tags.filter(t => includedLapseTags.includes(t.tagType)
&& t.lapseTypes.includes(BattlerTagLapseType.TURN_END)
&& !(t.lapse(pokemon, BattlerTagLapseType.TURN_END))).forEach(t => {
t.onRemove(pokemon);
tags.splice(tags.indexOf(t), 1);
});
});
// Remove any status tick phases

View File

@ -957,7 +957,7 @@ export class GameData {
enemyModifiers: scene.findModifiers(() => true, false).map(m => new PersistentModifierData(m, false)),
arena: new ArenaData(scene.arena),
pokeballCounts: scene.pokeballCounts,
money: scene.money,
money: Math.floor(scene.money),
score: scene.score,
waveIndex: scene.currentBattle.waveIndex,
battleType: scene.currentBattle.battleType,
@ -1047,7 +1047,7 @@ export class GameData {
scene.pokeballCounts = Overrides.POKEBALL_OVERRIDE.pokeballs;
}
scene.money = sessionData.money || 0;
scene.money = Math.floor(sessionData.money || 0);
scene.updateMoneyText();
if (scene.money > this.gameStats.highestMoney) {

View File

@ -6,6 +6,10 @@ const LATEST_VERSION = "1.0.5";
export function applySessionDataPatches(data: SessionSaveData) {
const curVersion = data.gameVersion;
// Always sanitize money as a safeguard
data.money = Math.floor(data.money);
if (curVersion !== LATEST_VERSION) {
switch (curVersion) {
case "1.0.0":