Fix Merge Conflicts

This commit is contained in:
xsn34kzx 2024-09-02 19:56:26 -04:00
commit 4a5faa8e5f
28 changed files with 1355 additions and 924 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -841,12 +841,13 @@ export default class BattleScene extends SceneBase {
} }
addEnemyPokemon(species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void): EnemyPokemon { addEnemyPokemon(species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void): EnemyPokemon {
if (Overrides.OPP_LEVEL_OVERRIDE > 0) {
level = Overrides.OPP_LEVEL_OVERRIDE;
}
if (Overrides.OPP_SPECIES_OVERRIDE) { if (Overrides.OPP_SPECIES_OVERRIDE) {
species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE); species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE);
} // The fact that a Pokemon is a boss or not can change based on its Species and level
boss = this.getEncounterBossSegments(this.currentBattle.waveIndex, level, species) > 1;
if (Overrides.OPP_LEVEL_OVERRIDE !== 0) {
level = Overrides.OPP_LEVEL_OVERRIDE;
} }
const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource); const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource);
@ -1327,6 +1328,13 @@ export default class BattleScene extends SceneBase {
} }
getEncounterBossSegments(waveIndex: integer, level: integer, species?: PokemonSpecies, forceBoss: boolean = false): integer { getEncounterBossSegments(waveIndex: integer, level: integer, species?: PokemonSpecies, forceBoss: boolean = false): integer {
if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1) {
return Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE;
} else if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE === 1) {
// The rest of the code expects to be returned 0 and not 1 if the enemy is not a boss
return 0;
}
if (this.gameMode.isDaily && this.gameMode.isWaveFinal(waveIndex)) { if (this.gameMode.isDaily && this.gameMode.isWaveFinal(waveIndex)) {
return 5; return 5;
} }

View File

@ -2377,9 +2377,13 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr {
pokemon.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m!.moveId, m!.ppUsed, m!.ppUp)); // TODO: are those bangs correct? pokemon.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m!.moveId, m!.ppUsed, m!.ppUp)); // TODO: are those bangs correct?
pokemon.summonData.types = target.getTypes(); pokemon.summonData.types = target.getTypes();
pokemon.scene.playSound("battle_anims/PRSFX- Transform"); pokemon.scene.playSound("battle_anims/PRSFX- Transform");
pokemon.loadAssets(false).then(() => pokemon.playAnim()); pokemon.loadAssets(false).then(() => {
pokemon.playAnim();
pokemon.updateInfo();
});
pokemon.scene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target.name, })); pokemon.scene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target.name, }));

View File

@ -13,7 +13,6 @@ import { TrainerType } from "#enums/trainer-type";
import { Nature } from "./nature"; import { Nature } from "./nature";
import { Moves } from "#app/enums/moves.js"; import { Moves } from "#app/enums/moves.js";
import { TypeColor, TypeShadow } from "#app/enums/color.js"; import { TypeColor, TypeShadow } from "#app/enums/color.js";
import { Gender } from "./gender";
import { pokemonEvolutions } from "./pokemon-evolutions"; import { pokemonEvolutions } from "./pokemon-evolutions";
import { pokemonFormChanges } from "./pokemon-forms"; import { pokemonFormChanges } from "./pokemon-forms";
@ -659,7 +658,6 @@ export class FreshStartChallenge extends Challenge {
pokemon.luck = 0; // No luck pokemon.luck = 0; // No luck
pokemon.shiny = false; // Not shiny pokemon.shiny = false; // Not shiny
pokemon.variant = 0; // Not shiny pokemon.variant = 0; // Not shiny
pokemon.gender = Gender.MALE; // Starters default to male
pokemon.formIndex = 0; // Froakie should be base form pokemon.formIndex = 0; // Froakie should be base form
pokemon.ivs = [10, 10, 10, 10, 10, 10]; // Default IVs of 10 for all stats pokemon.ivs = [10, 10, 10, 10, 10, 10]; // Default IVs of 10 for all stats
return true; return true;

View File

@ -1,6 +1,6 @@
import { BattleSpec } from "#enums/battle-spec"; import { BattleSpec } from "#enums/battle-spec";
import { TrainerType } from "#enums/trainer-type"; import { TrainerType } from "#enums/trainer-type";
import {trainerConfigs} from "./trainer-config"; import { trainerConfigs } from "./trainer-config";
export interface TrainerTypeMessages { export interface TrainerTypeMessages {
encounter?: string | string[], encounter?: string | string[],
@ -707,6 +707,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
] ]
} }
], ],
[TrainerType.ROOD]: [
{
encounter: [
"dialogue:rood.encounter.1",
"dialogue:rood.encounter.2",
"dialogue:rood.encounter.3",
],
victory: [
"dialogue:rood.victory.1",
"dialogue:rood.victory.2",
"dialogue:rood.victory.3",
]
}
],
[TrainerType.FLARE_GRUNT]: [ [TrainerType.FLARE_GRUNT]: [
{ {
encounter: [ encounter: [

View File

@ -6026,6 +6026,7 @@ export class TransformAttr extends MoveEffectAttr {
user.loadAssets(false).then(() => { user.loadAssets(false).then(() => {
user.playAnim(); user.playAnim();
user.updateInfo();
resolve(true); resolve(true);
}); });
}); });

View File

@ -4296,7 +4296,7 @@ export class EnemyPokemon extends Pokemon {
//console.log('damage', damage, 'segment', segmentsBypassed + 1, 'segment size', segmentSize, 'damage needed', Math.round(segmentSize * Math.pow(2, segmentsBypassed + 1))); //console.log('damage', damage, 'segment', segmentsBypassed + 1, 'segment size', segmentSize, 'damage needed', Math.round(segmentSize * Math.pow(2, segmentsBypassed + 1)));
} }
damage = hpRemainder + Math.round(segmentSize * segmentsBypassed); damage = Utils.toDmgValue(this.hp - hpThreshold + segmentSize * segmentsBypassed);
clearedBossSegmentIndex = s - segmentsBypassed; clearedBossSegmentIndex = s - segmentsBypassed;
} }
break; break;
@ -4361,19 +4361,15 @@ export class EnemyPokemon extends Pokemon {
} }
} }
// Increment the amount of stages the chosen stat will be raised
let stages = 1; let stages = 1;
switch (segmentIndex) {
case 1: // increase the boost if the boss has at least 3 segments and we passed last shield
if (this.bossSegments >= 3) { if (this.bossSegments >= 3 && this.bossSegmentIndex === 1) {
stages++; stages++;
} }
break; // increase the boost if the boss has at least 5 segments and we passed the second to last shield
case 2: if (this.bossSegments >= 5 && this.bossSegmentIndex === 2) {
if (this.bossSegments >= 5) { stages++;
stages++;
}
break;
} }
this.scene.unshiftPhase(new StatStageChangePhase(this.scene, this.getBattlerIndex(), true, [ boostedStat! ], stages, true, true)); this.scene.unshiftPhase(new StatStageChangePhase(this.scene, this.getBattlerIndex(), true, [ boostedStat! ], stages, true, true));

View File

@ -10,5 +10,5 @@
"eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!", "eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!",
"revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!", "revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!",
"formChange": "{{preName}} hat seine Form geändert!", "formChange": "{{preName}} hat seine Form geändert!",
"disguiseChange": "Its disguise served it as a decoy!" "disguiseChange": "Sein Kostüm hat die Attacke absorbiert!"
} }

View File

@ -1,268 +0,0 @@
{
"Achievements": {
"name": "Achievements"
},
"Locked": {
"name": "Locked"
},
"MoneyAchv": {
"description": "Accumulate a total of ₽{{moneyAmount}}"
},
"10K_MONEY": {
"name": "Money Haver"
},
"100K_MONEY": {
"name": "Rich"
},
"1M_MONEY": {
"name": "Millionaire"
},
"10M_MONEY": {
"name": "One Percenter"
},
"DamageAchv": {
"description": "Inflict {{damageAmount}} damage in one hit"
},
"250_DMG": {
"name": "Hard Hitter"
},
"1000_DMG": {
"name": "Harder Hitter"
},
"2500_DMG": {
"name": "That's a Lotta Damage!"
},
"10000_DMG": {
"name": "One Punch Man"
},
"HealAchv": {
"description": "Heal {{healAmount}} {{HP}} at once with a move, ability, or held item"
},
"250_HEAL": {
"name": "Novice Healer"
},
"1000_HEAL": {
"name": "Big Healer"
},
"2500_HEAL": {
"name": "Cleric"
},
"10000_HEAL": {
"name": "Recovery Master"
},
"LevelAchv": {
"description": "Level up a Pokémon to Lv{{level}}"
},
"LV_100": {
"name": "But Wait, There's More!"
},
"LV_250": {
"name": "Elite"
},
"LV_1000": {
"name": "To Go Even Further Beyond"
},
"RibbonAchv": {
"description": "Accumulate a total of {{ribbonAmount}} Ribbons"
},
"10_RIBBONS": {
"name": "Pokémon League Champion"
},
"25_RIBBONS": {
"name": "Great League Champion"
},
"50_RIBBONS": {
"name": "Ultra League Champion"
},
"75_RIBBONS": {
"name": "Rogue League Champion"
},
"100_RIBBONS": {
"name": "Master League Champion"
},
"TRANSFER_MAX_STAT_STAGE": {
"name": "Teamwork",
"description": "Baton pass to another party member with at least one stat stage maxed out"
},
"MAX_FRIENDSHIP": {
"name": "Friendmaxxing",
"description": "Reach max friendship on a Pokémon"
},
"MEGA_EVOLVE": {
"name": "Megamorph",
"description": "Mega evolve a Pokémon"
},
"GIGANTAMAX": {
"name": "Absolute Unit",
"description": "Gigantamax a Pokémon"
},
"TERASTALLIZE": {
"name": "STAB Enthusiast",
"description": "Terastallize a Pokémon"
},
"STELLAR_TERASTALLIZE": {
"name": "The Hidden Type",
"description": "Stellar Terastallize a Pokémon"
},
"SPLICE": {
"name": "Infinite Fusion",
"description": "Splice two Pokémon together with DNA Splicers"
},
"MINI_BLACK_HOLE": {
"name": "A Hole Lot of Items",
"description": "Acquire a Mini Black Hole"
},
"CATCH_MYTHICAL": {
"name": "Mythical",
"description": "Catch a mythical Pokémon"
},
"CATCH_SUB_LEGENDARY": {
"name": "(Sub-)Legendary",
"description": "Catch a sub-legendary Pokémon"
},
"CATCH_LEGENDARY": {
"name": "Legendary",
"description": "Catch a legendary Pokémon"
},
"SEE_SHINY": {
"name": "Shiny",
"description": "Find a shiny Pokémon in the wild"
},
"SHINY_PARTY": {
"name": "That's Dedication",
"description": "Have a full party of shiny Pokémon"
},
"HATCH_MYTHICAL": {
"name": "Mythical Egg",
"description": "Hatch a mythical Pokémon from an egg"
},
"HATCH_SUB_LEGENDARY": {
"name": "Sub-Legendary Egg",
"description": "Hatch a sub-legendary Pokémon from an egg"
},
"HATCH_LEGENDARY": {
"name": "Legendary Egg",
"description": "Hatch a legendary Pokémon from an egg"
},
"HATCH_SHINY": {
"name": "Shiny Egg",
"description": "Hatch a shiny Pokémon from an egg"
},
"HIDDEN_ABILITY": {
"name": "Hidden Potential",
"description": "Catch a Pokémon with a hidden ability"
},
"PERFECT_IVS": {
"name": "Certificate of Authenticity",
"description": "Get perfect IVs on a Pokémon"
},
"CLASSIC_VICTORY": {
"name": "Undefeated",
"description": "Beat the game in classic mode"
},
"UNEVOLVED_CLASSIC_VICTORY": {
"name": "Bring Your Child To Work Day",
"description": "Beat the game in Classic Mode with at least one unevolved party member."
},
"MONO_GEN_ONE": {
"name": "The Original Rival",
"description": "Complete the generation one only challenge."
},
"MONO_GEN_TWO": {
"name": "Generation 1.5",
"description": "Complete the generation two only challenge."
},
"MONO_GEN_THREE": {
"name": "Too much water?",
"description": "Complete the generation three only challenge."
},
"MONO_GEN_FOUR": {
"name": "Is she really the hardest?",
"description": "Complete the generation four only challenge."
},
"MONO_GEN_FIVE": {
"name": "All Original",
"description": "Complete the generation five only challenge."
},
"MONO_GEN_SIX": {
"name": "Almost Royalty",
"description": "Complete the generation six only challenge."
},
"MONO_GEN_SEVEN": {
"name": "Only Technically",
"description": "Complete the generation seven only challenge."
},
"MONO_GEN_EIGHT": {
"name": "A Champion Time!",
"description": "Complete the generation eight only challenge."
},
"MONO_GEN_NINE": {
"name": "She was going easy on you",
"description": "Complete the generation nine only challenge."
},
"MonoType": {
"description": "Complete the {{type}} monotype challenge."
},
"MONO_NORMAL": {
"name": "Extra Ordinary"
},
"MONO_FIGHTING": {
"name": "I Know Kung Fu"
},
"MONO_FLYING": {
"name": "Angry Birds"
},
"MONO_POISON": {
"name": "Kanto's Favourite"
},
"MONO_GROUND": {
"name": "Forecast: Earthquakes"
},
"MONO_ROCK": {
"name": "Brock Hard"
},
"MONO_BUG": {
"name": "You Like Jazz?"
},
"MONO_GHOST": {
"name": "Who You Gonna Call?"
},
"MONO_STEEL": {
"name": "Iron Giant"
},
"MONO_FIRE": {
"name": "I Cast Fireball!"
},
"MONO_WATER": {
"name": "When It Rains, It Pours"
},
"MONO_GRASS": {
"name": "Can't Touch This"
},
"MONO_ELECTRIC": {
"name": "Aim For The Horn!"
},
"MONO_PSYCHIC": {
"name": "Big Brain Energy"
},
"MONO_ICE": {
"name": "Walking On Thin Ice"
},
"MONO_DRAGON": {
"name": "Pseudo-Legend Club"
},
"MONO_DARK": {
"name": "It's Just A Phase"
},
"MONO_FAIRY": {
"name": "Hey! Listen!"
},
"FRESH_START": {
"name": "First Try!",
"description": "Complete the Fresh Start challenge."
},
"INVERSE_BATTLE": {
"name": "Mirror rorriM",
"description": "Complete the Inverse Battle challenge.\n.egnellahc elttaB esrevnI eht etelpmoC"
}
}

View File

@ -699,6 +699,7 @@
"encounter": { "encounter": {
"1": "I'll fight you with all I have to wipe you out!", "1": "I'll fight you with all I have to wipe you out!",
"2": "I don't care if you're a kid or what. I'll send you flying if you threaten us!", "2": "I don't care if you're a kid or what. I'll send you flying if you threaten us!",
"2_female": "I don't care if you're a kid or what. I'll send you flying if you threaten us!",
"3": "I was told to turn away Trainers, whomever they might be!", "3": "I was told to turn away Trainers, whomever they might be!",
"4": "I'll show you the power of Aether Paradise!", "4": "I'll show you the power of Aether Paradise!",
"5": "Now that you've learned of the darkness at the heart of Aether Paradise, we'll need you to conveniently disappear!" "5": "Now that you've learned of the darkness at the heart of Aether Paradise, we'll need you to conveniently disappear!"
@ -715,11 +716,13 @@
"encounter": { "encounter": {
"1": "I, Branch Chief Faba, shall show you the harshness of the real world!", "1": "I, Branch Chief Faba, shall show you the harshness of the real world!",
"2": "The man who is called Aether Paradise's last line of defense is to battle a mere child?", "2": "The man who is called Aether Paradise's last line of defense is to battle a mere child?",
"2_female": "The man who is called Aether Paradise's last line of defense is to battle a mere child?",
"3": "I, Faba, am the Aether Branch Chief. The only one in the world, I'm irreplaceable." "3": "I, Faba, am the Aether Branch Chief. The only one in the world, I'm irreplaceable."
}, },
"victory": { "victory": {
"1": "Aiyee!", "1": "Aiyee!",
"2": "H-h-how can this be?! How could this child...", "2": "H-h-how can this be?! How could this child...",
"2_female": "H-h-how can this be?! How could this child...",
"3": "This is why... This is why I can't bring myself to like children." "3": "This is why... This is why I can't bring myself to like children."
} }
}, },
@ -727,9 +730,12 @@
"encounter": { "encounter": {
"1": "We're not bad-we're just hard!", "1": "We're not bad-we're just hard!",
"2": "You want some? That's how we say hello! Nice knowing you, punks!", "2": "You want some? That's how we say hello! Nice knowing you, punks!",
"2_female": "You want some? That's how we say hello! Nice knowing you, punks!",
"3": "We're just a bunch of guys and gals with a great interest in other people's Pokémon!", "3": "We're just a bunch of guys and gals with a great interest in other people's Pokémon!",
"4": "Why you trying to act hard when we're already hard as bones out here, homie?", "4": "Why you trying to act hard when we're already hard as bones out here, homie?",
"5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!" "4_female": "Why you trying to act hard when we're already hard as bones out here, homie?",
"5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!",
"5_female": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!"
}, },
"victory": { "victory": {
"1": "Huh? Is it over already?", "1": "Huh? Is it over already?",
@ -742,11 +748,13 @@
"plumeria": { "plumeria": {
"encounter": { "encounter": {
"1": " ...Hmph. You don't look like anything special to me.", "1": " ...Hmph. You don't look like anything special to me.",
"1_female": " ...Hmph. You don't look like anything special to me.",
"2": "It takes these dumb Grunts way too long to deal with you kids...", "2": "It takes these dumb Grunts way too long to deal with you kids...",
"3": "Mess with anyone in Team Skull, and I'll show you how serious I can get." "3": "Mess with anyone in Team Skull, and I'll show you how serious I can get."
}, },
"victory": { "victory": {
"1": "Hmmph! You're pretty strong. I'll give you that.", "1": "Hmmph! You're pretty strong. I'll give you that.",
"1_female": "Hmmph! You're pretty strong. I'll give you that.",
"2": "Hmmph. Guess you are pretty tough. Now I understand why my Grunts waste so much time battling kids.", "2": "Hmmph. Guess you are pretty tough. Now I understand why my Grunts waste so much time battling kids.",
"3": "Hmmph! I guess I just have to hold that loss." "3": "Hmmph! I guess I just have to hold that loss."
} }
@ -755,6 +763,7 @@
"encounter": { "encounter": {
"1": "It looks like this is the end of the line for you!", "1": "It looks like this is the end of the line for you!",
"2": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.", "2": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
"2_female": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
"3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?" "3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?"
}, },
"victory": { "victory": {
@ -772,6 +781,7 @@
"victory": { "victory": {
"1": "*sigh* I wasn't able to win... Oleana...you really are a hopeless woman.", "1": "*sigh* I wasn't able to win... Oleana...you really are a hopeless woman.",
"2": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..", "2": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..",
"2_female": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..",
"3": "*sigh* I am one tired Oleana..." "3": "*sigh* I am one tired Oleana..."
} }
}, },

View File

@ -10,5 +10,5 @@
"eternamaxChange": "¡{{preName}} ha eternamaxizado a {{pokemonName}}!", "eternamaxChange": "¡{{preName}} ha eternamaxizado a {{pokemonName}}!",
"revertChange": "¡{{pokemonName}} ha revertido a su forma original!", "revertChange": "¡{{pokemonName}} ha revertido a su forma original!",
"formChange": "¡{{preName}} ha cambiado de forma!", "formChange": "¡{{preName}} ha cambiado de forma!",
"disguiseChange": "¡El disfraz ha actuado como señuelo!\t" "disguiseChange": "¡El disfraz ha actuado como señuelo!"
} }

View File

@ -1,6 +1,6 @@
{ {
"ending": "@c{smile}Oh ? Tas gagné ?@d{96} @c{smile_eclosed}Jaurais dû le savoir.\nMais de voilà de retour.\n$@c{smile}Cest terminé.@d{64} Tas brisé ce cycle infernal.\n$@c{serious_smile_fists}Tas aussi accompli ton rêve non ?\nTu nas pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que tas fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, jen ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un ptit combat une fois rentrés ?\nSi tes daccord.", "ending": "@c{smile}Oh ? Tas gagné ?@d{96} @c{smile_eclosed}Jaurais dû men douter.\nMais te voilà enfin de retour.\n$@c{smile}Cest terminé.@d{64} Tas brisé ce cycle infernal.\n$@c{serious_smile_fists}Tas aussi accompli ton rêve non ?\nTu nas pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que tas fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, jen ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un ptit combat une fois rentrés ?\nSi tes daccord.",
"ending_female": "@c{shock}Tes revenu ?@d{32} Ça veut dire…@d{96} que tas gagné ?!\n@c{smile_ehalf}Jaurais dû le savoir.\n$@c{smile_eclosed}Bien sûr… Jai toujours eu ce sentiment.\n@c{smile}Cest fini maitenant hein ? Tas brisé ce cycle.\n$@c{smile_ehalf}Tas aussi accompli ton rêve non ?\nTu nas pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que tas fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}Jdéconne !@d{64} @c{smile}Jamais joublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un ptit combat, comme au bon vieux temps ?", "ending_female": "@c{shock}Tes revenu ?@d{32} Ça veut dire…@d{96} que tas gagné ?!\n@c{smile_ehalf}Jaurais dû men douter.\n$@c{smile_eclosed}Bien sûr… Jai toujours eu ce sentiment.\n@c{smile}Cest fini maintenant hein ? Tas brisé ce cycle.\n$@c{smile_ehalf}Tas aussi accompli ton rêve non ?\nTu nas pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que tas fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}Jdéconne !@d{64} @c{smile}Jamais joublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un ptit combat, comme au bon vieux temps ?",
"ending_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !", "ending_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !",
"ending_name": "Les devs" "ending_name": "Les devs"
} }

View File

@ -9,7 +9,7 @@
"6": "Allez, cest parti !", "6": "Allez, cest parti !",
"7": "Attention, me voilà !\nTu vas voir comment jsuis fort !", "7": "Attention, me voilà !\nTu vas voir comment jsuis fort !",
"8": "Coucou… Tu veux voir mes bô Pokémon ?", "8": "Coucou… Tu veux voir mes bô Pokémon ?",
"9": "Trève de mondanités. Ramène-toi quand tu le sens !", "9": "Trêve de mondanités. Ramène-toi quand tu le sens !",
"10": "Baisse pas ta garde si tu veux pas pleurer davoir perdu face à un gamin.", "10": "Baisse pas ta garde si tu veux pas pleurer davoir perdu face à un gamin.",
"11": "Jai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !", "11": "Jai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !",
"12": "Incroyable que ty sois parvenu ! Mais la suite va pas être une partie de plaisir.", "12": "Incroyable que ty sois parvenu ! Mais la suite va pas être une partie de plaisir.",
@ -68,7 +68,7 @@
"3": "Hum, tes pas trop laxiste avec tes Pokémon ?\nTrop les chouchouter nest pas bon." "3": "Hum, tes pas trop laxiste avec tes Pokémon ?\nTrop les chouchouter nest pas bon."
}, },
"victory": { "victory": {
"1": "Il est primordial de nourir et développer toutes les caractéristiques de chaque Pokémon.", "1": "Il est primordial de nourrir et développer toutes les caractéristiques de chaque Pokémon.",
"2": "Contrairement à moi, ces Pokémon ont un bon fond.", "2": "Contrairement à moi, ces Pokémon ont un bon fond.",
"3": "Trop déloges peut ruiner les Pokémon et les gens." "3": "Trop déloges peut ruiner les Pokémon et les gens."
}, },
@ -229,7 +229,7 @@
"encounter": { "encounter": {
"1": "Ne te mets pas en travers de la Team Galaxie !", "1": "Ne te mets pas en travers de la Team Galaxie !",
"2": "Sois témoin de la puissance de notre technologie et du futur qui se profile !", "2": "Sois témoin de la puissance de notre technologie et du futur qui se profile !",
"3": "Au nom de la Team Galaxie, jéliminerai quiconque se mettera sur notre route !", "3": "Au nom de la Team Galaxie, jéliminerai quiconque se mettra sur notre route !",
"4": "Prépare ta défaite !", "4": "Prépare ta défaite !",
"5": "Jespère que tes prêt à te prendre une raclée de lespace !", "5": "Jespère que tes prêt à te prendre une raclée de lespace !",
"5_female": "Jespère que tes prête à te prendre une raclée de lespace !" "5_female": "Jespère que tes prête à te prendre une raclée de lespace !"
@ -244,7 +244,7 @@
}, },
"plasma_grunt": { "plasma_grunt": {
"encounter": { "encounter": {
"1": "Pas de quatiers à ceux qui ne suivent pas notre idéal !", "1": "Pas de quartiers à quiconque ne suit pas notre idéal !",
"2": "Si je gagne, tu relâches tous tes Pokémon !", "2": "Si je gagne, tu relâches tous tes Pokémon !",
"3": "Si tu te mets en travers de la Team Plasma, je moccuperai de toi personnellement !", "3": "Si tu te mets en travers de la Team Plasma, je moccuperai de toi personnellement !",
"4": "La Team Plasma va libérer les Pokémon de tous les humains égoïstes dans ton genre !", "4": "La Team Plasma va libérer les Pokémon de tous les humains égoïstes dans ton genre !",
@ -275,6 +275,96 @@
"5": "Jappelle pas ça perdre, jappelle ça échouer avec panache !" "5": "Jappelle pas ça perdre, jappelle ça échouer avec panache !"
} }
}, },
"aether_grunt": {
"encounter": {
"1": "Je vais te mettre ta raclée !",
"2": "Jen ai rien à faire que tu sois une gosse. Tu vas tutoyer les étoiles si tu nous menaces !",
"2_female": "Jen ai rien à faire que tu sois une gosse. Tu vas tutoyer les étoiles si tu nous menaces !",
"3": "Jai pour ordre de ne laisser passer aucun Dresseur, peu importe qui cest !",
"4": "Je vais te montrer le pouvoir du Paradis Æther !",
"5": "Maintenant que tes au courant de ce quil se passe au cœur du Paradis Æther, fais-moi une faveur et disparait !"
},
"victory": {
"1": "Cest plutôt toi qui devrait mapprendre à en mettre…",
"2": "Pardon ? Jai pas compris…",
"3": "Peu importe les ordres, jamais jaurais pu te retenir en fait…",
"4": "Mhh… Il semblerait que jai perdu.",
"5": "Cest plutôt moi qui va disparaitre je crois."
}
},
"faba": {
"encounter": {
"1": "Moi, Directeur Saubohne, je vais te montrer de quel bois je me chauffe !",
"2": "Donc là, lhomme supposé être la dernière ligne défense du Paradis Æther doit affronter un mioche ?",
"2_female": "Donc là, lhomme supposé être la dernière ligne défense du Paradis Æther doit affronter un mioche ?",
"3": "Sil ny a quun seul nom à retenir au sein de la Fondation Æther, cest le mien : Saubohne !"
},
"victory": {
"1": "Gloups !",
"2": "Malheur ! Jai perdu face à un simple enfant ?!",
"2_female": "Malheur ! Jai perdu face à une simple enfant ?!",
"3": "Jai HORREUR des enfants !"
}
},
"skull_grunt": {
"encounter": {
"1": "Oush oush ! On est pas méchants, sauf si tu viens nous allumer la mèche-han !",
"2": "Ce manque de respect, jhallucine ! Tes allé trop loin, le mioche !",
"2_female": "Ce manque de respect, jhallucine ! Tes allée trop loin, la mioche !",
"3": "On est juste des gars et des meufs normaux, on voit un Pokémon on le prend !",
"4": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que tvas jouer frérot.",
"4_female": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que tvas jouer ma reus.",
"5": "Cousin, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu tincrustes chez nous, ça sfait pas ! ♪\n$Mais on est sympa, on a un plan pour toi ! ♪",
"5_female": "Cousine, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu tincrustes chez nous, ça sfait pas ! ♪\n$Mais on est sympa, on a un plan pour toi ! ♪"
},
"victory": {
"1": "Hein ? Cest déjà terminé ?",
"2": "… Ça craint grave! On stire!",
"3": "Ouais de toute on en avait pas bsoin de ton Pokémon… Ah ah…",
"4": "Ouh là, cest bon, jen demandais pas tant…",
"5": "On pèse plus que des Pokémon, tentends ?\nAlors tu vas nous respecter, oush !"
}
},
"plumeria": {
"encounter": {
"1": "Tsk. Tes un gamin tout ce quil y a de plus banal, en fait.",
"1_female": "Tsk. Tes une gamine tout ce quil y a de plus banal, en fait.",
"2": "Abrutis de sbires. Trop incompétents pour arriver à se débarasser de gamins…",
"3": "Si tu touches encore à un cheveu de mes lascars, tu vas pas comprendre cqui tarrive !"
},
"victory": {
"1": "Tsk. Tes pas mauvais. Jte laccorde.",
"1_female": "Tsk. Tes pas mauvaise. Jte laccorde.",
"2": "Tsk. Jdois reconnaitre que ten as dans le ventre.\n$Maintenant, jcomprends pourquoi mes gars narrêtent pas de se faire battre par toi.",
"3": "Tsk. Jcrois que j'ai plus quà assumer ma défaite."
}
},
"macro_grunt": {
"encounter": {
"1": "Hop hop hop ! Terminus !",
"2": "Tes un Dresseur nest-ce pas ?\n$Jai bien peur ce que ne soit pas une excuse suffisante pour nous interrompre dans notre travail.",
"2_female": "Tes une Dresseuse nest-ce pas ?\n$Jai bien peur ce que ne soit pas une excuse suffisante pour nous interrompre dans notre travail.",
"3": "Je travaille à Macro Cosmos Assurances !\nBesoin dune assurance-vie ?"
},
"victory": {
"1": "Je nai dautre choix que respectueusement me retirer.",
"2": "Mon argent de poche…\nPlus quà manger des pâtes pour la fin du mois…",
"3": "Chez Macro Cosmos, rien nest comparable à notre dévotion au travail !"
}
},
"oleana": {
"encounter": {
"1": "Je ne laisserai personne interférer avec les projets du président Shehroz.",
"2": "Je vois que vous avez su vous défaire de mes subalternes.\n$Mais assez joué. Il est temps de rentrer chez vous, maintenant.",
"3": "Je gagnerai en votre nom, monsieur le président."
},
"victory": {
"1": "*soupir* Comment ai-je fait pour perdre ainsi…?\nJe ne suis vraiment pas à la hauteur…",
"2": "Ah! Quelle erreur… Je naurais pas dû sous-estimer un Dresseur de ton calibre…",
"2_female": "Ah! Quelle erreur… Je naurais pas dû sous-estimer une Dresseuse de ton calibre…",
"3": "*soupir* Je suis fatiguée parton…"
}
},
"rocket_boss_giovanni_1": { "rocket_boss_giovanni_1": {
"encounter": { "encounter": {
"1": "Bien. Je dois admettre que je suis impressionné de te voir ici !" "1": "Bien. Je dois admettre que je suis impressionné de te voir ici !"
@ -468,7 +558,7 @@
"4": "Voir un tel jardin rempli de fleurs est si apaisant…" "4": "Voir un tel jardin rempli de fleurs est si apaisant…"
}, },
"victory": { "victory": {
"1": "Bien joué, cest mértié.", "1": "Bien joué, cest mérité.",
"2": "Dommage, on samusait si bien…", "2": "Dommage, on samusait si bien…",
"3": "Oh non, le combat est terminé…", "3": "Oh non, le combat est terminé…",
"4": "Aaah, ça fait du bien !\nMerci, jen avais besoin." "4": "Aaah, ça fait du bien !\nMerci, jen avais besoin."
@ -505,15 +595,15 @@
}, },
"rival": { "rival": {
"encounter": { "encounter": {
"1": "@c{smile}Ah, je te cherchais ! Je savais que tétais pressé de partir, mais je mattendais quand même à un au revoir…\n$@c{smile_eclosed}Tas finalement décidé de réaliser ton rêve ?\nJai peine à y croire.\n$@c{serious_smile_fists}Vu que tes là, ça te dis un petit combat ?\nJe voudrais quand même massurer que tes prêt.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que tas !" "1": "@c{smile}Ah, je te cherchais ! Je savais que tétais pressée de partir, mais je mattendais quand même à un au revoir…\n$@c{smile_eclosed}Tas finalement décidé de réaliser ton rêve ?\nJai peine à y croire.\n$@c{serious_smile_fists}Vu que tes là, ça te dis un petit combat ?\nJe voudrais quand même massurer que tes prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que tas !"
}, },
"victory": { "victory": {
"1": "@c{shock}Wah… Tu mas vraiment lavé.\nTes vraiment un débutant ?\n$@c{smile}Tas peut-être eu de la chance, mais…\nPeut-être que tarriveras jusquau bout du chemin.\n$Dailleurs, le prof ma demandé de te filer ces objets.\nIls ont lair sympas.\n$@c{serious_smile_fists}Bonne chance à toi !" "1": "@c{shock}Wah… Tu mas vraiment lavé.\nTes vraiment une débutante ?\n$@c{smile}Tas peut-être eu de la chance, mais…\nPeut-être que tarriveras jusquau bout du chemin.\n$Dailleurs, le prof ma demandé de te filer ces objets.\nIls ont lair sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
} }
}, },
"rival_female": { "rival_female": {
"encounter": { "encounter": {
"1": "@c{smile_wave}Ah, te voilà ! Je tai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}Tas décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de mavoir oubliée,\nà une conditon. @c{smile_wave_wink}Que tu maffronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant davoir commencé, hein ?" "1": "@c{smile_wave}Ah, te voilà ! Je tai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}Tas décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de mavoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu maffronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant davoir commencé, hein ?"
}, },
"victory": { "victory": {
"1": "@c{shock}Tu viens de commencer et tes déjà si fort ?!@d{96}\n@c{angry}Tas triché non ? Avoue !\n$@c{smile_wave_wink}Jdéconne !@d{64} @c{smile_eclosed}Jai perdu dans les règles…\nJai le sentiment que tu vas très bien ten sortir.\n$@c{smile}Dailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !" "1": "@c{shock}Tu viens de commencer et tes déjà si fort ?!@d{96}\n@c{angry}Tas triché non ? Avoue !\n$@c{smile_wave_wink}Jdéconne !@d{64} @c{smile_eclosed}Jai perdu dans les règles…\nJai le sentiment que tu vas très bien ten sortir.\n$@c{smile}Dailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !"
@ -521,10 +611,10 @@
}, },
"rival_2": { "rival_2": {
"encounter": { "encounter": {
"1": "@c{smile}Hé, toi aussi tes là ?\n@c{smile_eclosed}Toujours invaincu, hein… ?\n$@c{serious_mopen_fists}Je sais que jai lair de tavoir suivi ici, mais cest pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait davoir une revanche depuis que tu mas battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nCest parti !" "1": "@c{smile}Hé, toi aussi tes là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que jai lair de tavoir suivie ici, mais cest pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait davoir une revanche depuis que tu mas battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nCest parti !"
}, },
"victory": { "victory": {
"1": "@c{neutral_eclosed}Oh. Je crois que jai trop pris la confiance.\n$@c{smile}Pas grave, cest OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus mentrainer !\n\n$@c{smile}Ah, et pas que taies réellement besoin daide, mais jai ça en trop sur moi qui pourrait tintéresser.\n\n$@c{serious_smile_fists}Mais nespère plus en avoir dautres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi et profite bien de lévènement !" "1": "@c{neutral_eclosed}Oh. Je crois que jai trop pris la confiance.\n$@c{smile}Pas grave, cest OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus mentrainer !\n\n$@c{smile}Ah, et pas que taies réellement besoin daide, mais jai ça en trop sur moi qui pourrait tintéresser.\n\n$@c{serious_smile_fists}Mais nespère plus en avoir dautres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi !"
} }
}, },
"rival_2_female": { "rival_2_female": {
@ -532,7 +622,7 @@
"1": "@c{smile_wave}Hé, sympa de te croiser ici. Tas toujours lair invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je tespionne pas.\n@c{smile_eclosed}Cest juste que jétais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que cest pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, tas intérêt à tout donner !" "1": "@c{smile_wave}Hé, sympa de te croiser ici. Tas toujours lair invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je tespionne pas.\n@c{smile_eclosed}Cest juste que jétais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que cest pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, tas intérêt à tout donner !"
}, },
"victory": { "victory": {
"1": "@c{neutral}Je… Jétais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus mentrainer !\n$@c{smile_wave}Jai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}Cétaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup et profite bien de lévènement !" "1": "@c{neutral}Je… Jétais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus mentrainer !\n$@c{smile_wave}Jai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}Cétaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup !"
}, },
"defeat": { "defeat": {
"1": "Je suppose que cest parfois normal de perdre…" "1": "Je suppose que cest parfois normal de perdre…"
@ -540,7 +630,7 @@
}, },
"rival_3": { "rival_3": {
"encounter": { "encounter": {
"1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}Tes… toujours invaincu ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nCest plus pareil sans toi au village.\n$@c{serious}Je sais que cest égoïste, mais jai besoin dexpier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, cest juste irréaliste.\nGrandir, cest parfois aussi savoir perdre.\n$@c{neutral_eclosed}Tas un beau parcours, mais il y a encore tellement à venir et ça va pas sarranger. @c{neutral}Tes prêt pour ça ?\n$@c{serious_mopen_fists}Si tu les, alors prouve-le." "1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}Tes… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nCest plus pareil sans toi au village.\n$@c{serious}Je sais que cest égoïste, mais jai besoin dexpier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, cest juste irréaliste.\nGrandir, cest parfois aussi savoir perdre.\n$@c{neutral_eclosed}Tas un beau parcours, mais il y a encore tellement à venir et ça va pas sarranger. @c{neutral}Tes prête pour ça ?\n$@c{serious_mopen_fists}Si tu les, alors prouve-le."
}, },
"victory": { "victory": {
"1": "@c{angry_mhalf}Cest lunaire… Jai presque fait que mentrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?" "1": "@c{angry_mhalf}Cest lunaire… Jai presque fait que mentrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?"
@ -559,7 +649,7 @@
}, },
"rival_4": { "rival_4": {
"encounter": { "encounter": {
"1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}Jai appris à maximiser tout mon potentiel en mentrainant darrachepied.\n$@c{smile}Cest fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien na dimportance désormais, pas tant que jaurai pas gagné.\n$@c{neutral_eclosed}Jai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, cest pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prêt." "1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}Jai appris à maximiser tout mon potentiel en mentrainant darrachepied.\n$@c{smile}Cest fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien na dimportance désormais, pas tant que jaurai pas gagné.\n$@c{neutral_eclosed}Jai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, cest pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prête."
}, },
"victory": { "victory": {
"1": "@c{neutral}Que…@d{64} Qui es-tu ?" "1": "@c{neutral}Que…@d{64} Qui es-tu ?"
@ -597,7 +687,7 @@
}, },
"rival_6": { "rival_6": {
"encounter": { "encounter": {
"1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}Jai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}Cest même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}Jignore si je serai capable de laccomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il ma lair familier, comme si jy avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et cest comme si quelque chose ici me parlait.\n$Comme si cétait tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus quun lointain souvenir.\n$@c{neutral_eclosed}Dailleurs, qui peut dire aujourdhui quils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu tarrêtes, ça naura jamais de fin et tes le seul à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que cest la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu nas aucune chance." "1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}Jai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}Cest même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}Jignore si je serai capable de laccomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il ma lair familier, comme si jy avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et cest comme si quelque chose ici me parlait.\n$Comme si cétait tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus quun lointain souvenir.\n$@c{neutral_eclosed}Dailleurs, qui peut dire aujourdhui quils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu tarrêtes, ça naura jamais de fin et tes la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que cest la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu nas aucune chance."
}, },
"victory": { "victory": {
"1": "@c{smile_eclosed}Jai fait ce que javais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison." "1": "@c{smile_eclosed}Jai fait ce que javais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison."

View File

@ -1 +1,130 @@
{} {
"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": "",
"colleagues": "ビジネスパートナー",
"crush_kin": "格闘兄妹",
"cyclist": "サイクリング",
"cyclist_female": "サイクリング",
"cyclists": "サイクリングチーム",
"dancer": "ダンサー",
"dancer_female": "ダンサー",
"depot_agent": "鉄道員",
"doctor": "ドクター",
"doctor_female": "ドクター",
"firebreather": "火吹きやろう",
"fisherman": "釣り人",
"fisherman_female": "釣り人",
"gentleman": "ジェントルマン",
"guitarist": "ギタリスト",
"guitarist_female": "ギタリスト",
"harlequin": "クラウン",
"hiker": "山男",
"hooligans": "バッドチーム",
"hoopster": "バスケ選手",
"infielder": "野球選手",
"janitor": "清掃員",
"lady": "お嬢さま",
"lass": "ミニスカート",
"linebacker": "フットボーラー",
"maid": "メイド",
"madame": "マダム",
"medical_team": "医療チーム",
"musician": "ミュージシャン",
"hex_maniac": "オカルトマニア",
"nurse": "ナース",
"nursery_aide": "保育士",
"officer": "お巡りさん",
"parasol_lady": "パラソルおねえさん",
"pilot": "パイロット",
"pokéfan": "大好きクラブ",
"pokéfan_female": "大好きクラブ",
"pokéfan_family": "大好き夫婦",
"preschooler": "園児",
"preschooler_female": "園児",
"preschoolers": "園児たち",
"psychic": "サイキッカー",
"psychic_female": "サイキッカー",
"psychics": "サイキッ家",
"pokémon_ranger": "ポケモンレンジャー",
"pokémon_ranger_female": "ポケモンレンジャー",
"pokémon_rangers": "レンジャーズ",
"ranger": "レンジャー",
"restaurant_staff": "レストランスタッフ",
"rich": "お金持ち",
"rich_female": "お金持ち",
"rich_boy": "お坊っちゃま",
"rich_couple": "お二人さま",
"rich_kid": "ブルジョワ男子",
"rich_kid_female": "ブルジョワ女子",
"rich_kids": "ブルジョワ子達",
"roughneck": "スキンヘッズ",
"sailor": "船乗り",
"scientist": "研究員",
"scientist_female": "研究員",
"scientists": "研究チーム",
"smasher": "テニスプレイヤー",
"snow_worker": "冷凍作業員",
"snow_worker_female": "冷凍作業員",
"striker": "サッカー選手",
"school_kid": "塾帰り",
"school_kid_female": "塾帰り",
"school_kids": "塾生たち",
"swimmer": "海パンやろう",
"swimmer_female": "ビキニのおねえさん",
"swimmers": "水着カップル",
"twins": "双子ちゃん",
"veteran": "ベテラントレーナー",
"veteran_female": "ベテラントレーナー",
"veteran_duo": "ベテランコンビ",
"waiter": "ウエーター",
"waitress": "ウエートレス",
"worker": "作業員",
"worker_female": "作業員",
"workers": "作業班",
"youngster": "短パン小僧",
"rocket_grunt": "ロケット団の下っ端",
"rocket_grunts": " ロケット団の下っ端",
"rocket_grunt_female": "ロケット団の下っ端",
"magma_grunt": "マグマ団の下っ端",
"magma_grunt_female": "マグマ団の下っ端",
"magma_grunts": "マグマ団の下っ端",
"aqua_grunt": "アクア団の下っ端",
"aqua_grunt_female": "アクア団の下っ端",
"aqua_grunts": "アクア団の下っ端",
"galactic_grunt": "ギンガ団の下っ端",
"galactic_grunt_female": "ギンガ団の下っ端",
"galactic_grunts": "ギンガ団の下っ端",
"plasma_grunt": "プラスマ団の下っ端",
"plasma_grunt_female": "プラズマ団の下っ端",
"plasma_grunts": "プラズマ団の下っ端",
"flare_grunt": "フレア団の下っ端",
"flare_grunt_female": "フレア団の下っ端",
"flare_grunts": "フレア団の下っ端",
"aether_grunt": "エーテル財団の職員",
"aether_grunt_female": "エーテル財団の職員",
"aether_grunts": "エーテル財団の職員",
"skull_grunt": "スカル団の下っ端",
"skull_grunt_female": "スカル団の下っ端",
"skull_grunts": "スカル団の下っ端",
"macro_grunt": "マクロコスモスのトレーナ",
"macro_grunt_female": "マクロコスモスのトレーナ",
"macro_grunts": "マクロコスモスのトレーナ"
}

View File

@ -1 +1,164 @@
{} {
"brock": "タケシ",
"misty": "カスミ",
"lt_surge": "マチス",
"erika": "エリカ",
"janine": "アンズ",
"sabrina": "ナツメ",
"blaine": "カツラ",
"giovanni": "サカキ",
"falkner": "ハヤト",
"bugsy": "ツクシ",
"whitney": "アカネ",
"morty": "マツバ",
"chuck": "シジマ",
"jasmine": "ミカン",
"pryce": "ヤナギ",
"clair": "イブキ",
"roxanne": "ツツジ",
"brawly": "トウキ",
"wattson": "テッセン",
"flannery": "アスナ",
"norman": "センリ",
"winona": "ナギ",
"tate": "フウ",
"liza": "ラン",
"juan": "アダン",
"roark": "ヒョウタ",
"gardenia": "ナタネ",
"maylene": "スモモ",
"crasher_wake": "マキシ",
"fantina": "メリッサ",
"byron": "トウガン",
"candice": "スズナ",
"volkner": "デンジ",
"cilan": "デント",
"chili": "ポッド",
"cress": "コーン",
"cheren": "チェレン",
"lenora": "アロエ",
"roxie": "ホミカ",
"burgh": "アーティ",
"elesa": "カミツレ",
"clay": "ヤーコン",
"skyla": "フウロ",
"brycen": "ハチク",
"drayden": "シャガ",
"marlon": "シズイ",
"viola": "ビオラ",
"grant": "ザクロ",
"korrina": "コルニ",
"ramos": "フクジ",
"clemont": "シトロン",
"valerie": "マーシュ",
"olympia": "ゴジカ",
"wulfric": "ウルップ",
"milo": "ヤロー",
"nessa": "ルリナ",
"kabu": "カブ",
"bea": "サイトウ",
"allister": "オニオン",
"opal": "ポプラ",
"bede": "ビート",
"gordie": "マクワ",
"melony": "メロン",
"piers": "ネズ",
"marnie": "マリィ",
"raihan": "キバナ",
"katy": "カエデ",
"brassius": "コルサ",
"iono": " ナンジャモ",
"kofu": "ハイダイ",
"larry": "アオキ",
"ryme": "ライム",
"tulip": "リップ",
"grusha": "グルーシャ",
"lorelei": "カンナ",
"bruno": "シバ",
"agatha": "キクコ",
"lance": "ワタル",
"will": "イツキ",
"koga": "キョウ",
"karen": "カリン",
"sidney": "カゲツ",
"phoebe": "フヨウ",
"glacia": "プリム",
"drake": "ゲンジ",
"aaron": "リョウ",
"bertha": "キクノ",
"flint": "オーバ",
"lucian": "ゴヨウ",
"shauntal": "シキミ",
"marshal": "レンブ",
"grimsley": "ギーマ",
"caitlin": "カトレア",
"malva": "パキラ",
"siebold": "ズミ",
"wikstrom": "ガンピ",
"drasna": "ドラセナ",
"hala": "ハラ",
"molayne": "マーレイン",
"olivia": "ライチ",
"acerola": "アセロラ",
"kahili": "カヒリ",
"rika": "チリ",
"poppy": "ポピー",
"hassel": "ハッサク",
"crispin": "アカマツ",
"amarys": "ネリネ",
"lacey": "タロ",
"drayton": "カキツバタ",
"blue": "グリーン",
"red": "レッド",
"steven": "ダイゴ",
"wallace": "ミクリ",
"cynthia": "シロナ",
"alder": "アデク",
"iris": "アイリス",
"diantha": "カルネ",
"hau": "ハウ",
"geeta": "オモダカ",
"nemona": "ネモ",
"kieran": "スグリ",
"leon": "ダンデ",
"rival": "フィン",
"rival_female": "アイヴィー",
"archer": "アポロ",
"ariana": "アテナ",
"proton": "ランス",
"petrel": "ラムダ",
"tabitha": "ホムラ",
"courtney": "カガリ",
"shelly": "イズミ",
"matt": "ウシオ",
"mars": "マーズ",
"jupiter": "ジュピター",
"saturn": "サターン",
"zinzolin": "ヴィオ",
"rood": "ロット",
"xerosic": "クセロシキ",
"bryony": "バラ",
"faba": "ザオボー",
"plumeria": "プルメリ",
"oleana": "オリーヴ",
"maxie": "マツブサ",
"archie": "アオギリ",
"cyrus": "アカギ",
"ghetsis": "ゲーチス",
"lysandre": "フラダリ",
"lusamine": "ルザミーネ",
"guzma": "グズマ",
"rose": "ローズ",
"blue_red_double": "グリーンとレッド",
"red_blue_double": "レッドとグリーン",
"tate_liza_double": "フウとラン",
"liza_tate_double": "ランとフウ",
"steven_wallace_double": "ダイゴとミクリ",
"wallace_steven_double": "ミクリとダイゴ",
"alder_iris_double": "アデクとアイリス",
"iris_alder_double": "アイリスとアデク",
"marnie_piers_double": "マリィとネズ",
"piers_marnie_double": "ネズとマリィ"
}

View File

@ -1 +1,38 @@
{} {
"elite_four": "四天王",
"elite_four_female": "四天王",
"gym_leader": "ジムリーダー",
"gym_leader_female": "ジムリーダー",
"gym_leader_double": "ジムリーダーコンビ",
"champion": "チャンピオン",
"champion_female": "チャンピオン",
"champion_double": "チャンピオンコンビ",
"rival": "ライバル",
"professor": "ポケモン博士",
"frontier_brain": "フロンティアブレーン",
"rocket_boss": "ロケット団ボス",
"magma_boss": "マグマ団リーダー",
"aqua_boss": "アクア団リーダー",
"galactic_boss": "ギンガ団ボス",
"plasma_boss": "プラズマ団ボス",
"flare_boss": "フレア団ボス",
"aether_boss": "エーテル代表",
"skull_boss": "スカル団ボス",
"macro_boss": "マクロコスモス社長",
"rocket_admin": "ロケット団幹部",
"rocket_admin_female": "ロケット団幹部",
"magma_admin": "マグマ団幹部",
"magma_admin_female": "マグマロケット団幹部",
"aqua_admin": "アクア団幹部",
"aqua_admin_female": "アクア団幹部",
"galactic_commander": "ギンガ団幹部",
"galactic_commander_female": "ギンガ団幹部",
"plasma_sage": "プラズマ団賢人",
"plasma_admin": "プラズマ団賢人",
"flare_admin": "フレア団幹部",
"flare_admin_female": "フレア団幹部",
"aether_admin": "エーテル支部長",
"skull_admin": "スカル団幹部",
"macro_admin": "マクロコスモス"
}

View File

@ -2244,7 +2244,7 @@ export class ModifierTypeOption {
} }
export function getPartyLuckValue(party: Pokemon[]): integer { export function getPartyLuckValue(party: Pokemon[]): integer {
const luck = Phaser.Math.Clamp(party.map(p => p.isFainted() ? 0 : p.getLuck()) const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() : 0)
.reduce((total: integer, value: integer) => total += value, 0), 0, 14); .reduce((total: integer, value: integer) => total += value, 0), 0, 14);
return luck || 0; return luck || 0;
} }

View File

@ -116,6 +116,14 @@ class DefaultOverrides {
readonly OPP_VARIANT_OVERRIDE: Variant = 0; readonly OPP_VARIANT_OVERRIDE: Variant = 0;
readonly OPP_IVS_OVERRIDE: number | number[] = []; readonly OPP_IVS_OVERRIDE: number | number[] = [];
readonly OPP_FORM_OVERRIDES: Partial<Record<Species, number>> = {}; readonly OPP_FORM_OVERRIDES: Partial<Record<Species, number>> = {};
/**
* Override to give the enemy Pokemon a given amount of health segments
*
* 0 (default): the health segments will be handled normally based on wave, level and species
* 1: the Pokemon will have a single health segment and therefore will not be a boss
* 2+: the Pokemon will be a boss with the given number of health segments
*/
readonly OPP_HEALTH_SEGMENTS_OVERRIDE: number = 0;
// ------------- // -------------
// EGG OVERRIDES // EGG OVERRIDES

View File

@ -26,6 +26,7 @@ import { ScanIvsPhase } from "./scan-ivs-phase";
import { ShinySparklePhase } from "./shiny-sparkle-phase"; import { ShinySparklePhase } from "./shiny-sparkle-phase";
import { SummonPhase } from "./summon-phase"; import { SummonPhase } from "./summon-phase";
import { ToggleDoublePositionPhase } from "./toggle-double-position-phase"; import { ToggleDoublePositionPhase } from "./toggle-double-position-phase";
import Overrides from "#app/overrides";
export class EncounterPhase extends BattlePhase { export class EncounterPhase extends BattlePhase {
private loaded: boolean; private loaded: boolean;
@ -112,10 +113,11 @@ export class EncounterPhase extends BattlePhase {
if (battle.battleType === BattleType.TRAINER) { if (battle.battleType === BattleType.TRAINER) {
loadEnemyAssets.push(battle.trainer?.loadAssets().then(() => battle.trainer?.initSprite())!); // TODO: is this bang correct? loadEnemyAssets.push(battle.trainer?.loadAssets().then(() => battle.trainer?.initSprite())!); // TODO: is this bang correct?
} else { } else {
// This block only applies for double battles to init the boss segments (idk why it's split up like this) const overridedBossSegments = Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1;
if (battle.enemyParty.filter(p => p.isBoss()).length > 1) { // for double battles, reduce the health segments for boss Pokemon unless there is an override
if (!overridedBossSegments && battle.enemyParty.filter(p => p.isBoss()).length > 1) {
for (const enemyPokemon of battle.enemyParty) { for (const enemyPokemon of battle.enemyParty) {
// If the enemy pokemon is a boss and wasn't populated from data source, then set it up // If the enemy pokemon is a boss and wasn't populated from data source, then update the number of segments
if (enemyPokemon.isBoss() && !enemyPokemon.isPopulatedFromDataSource) { if (enemyPokemon.isBoss() && !enemyPokemon.isPopulatedFromDataSource) {
enemyPokemon.setBoss(true, Math.ceil(enemyPokemon.bossSegments * (enemyPokemon.getSpeciesForm().baseTotal / totalBst))); enemyPokemon.setBoss(true, Math.ceil(enemyPokemon.bossSegments * (enemyPokemon.getSpeciesForm().baseTotal / totalBst)));
enemyPokemon.initBattleInfo(); enemyPokemon.initBattleInfo();

View File

@ -1488,7 +1488,7 @@ export class GameData {
}; };
} }
const defaultStarterAttr = DexAttr.NON_SHINY | DexAttr.MALE | DexAttr.DEFAULT_VARIANT | DexAttr.DEFAULT_FORM; const defaultStarterAttr = DexAttr.NON_SHINY | DexAttr.MALE | DexAttr.FEMALE | DexAttr.DEFAULT_VARIANT | DexAttr.DEFAULT_FORM;
const defaultStarterNatures: Nature[] = []; const defaultStarterNatures: Nature[] = [];
@ -1919,6 +1919,7 @@ export class GameData {
fixStarterData(systemData: SystemSaveData): void { fixStarterData(systemData: SystemSaveData): void {
for (const starterId of defaultStarterSpecies) { for (const starterId of defaultStarterSpecies) {
systemData.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; systemData.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1;
systemData.dexData[starterId].caughtAttr |= DexAttr.FEMALE;
} }
} }

View File

@ -8,6 +8,7 @@ import { Stat, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat";
import { Abilities } from "#enums/abilities"; import { Abilities } from "#enums/abilities";
import { SPLASH_ONLY } from "../utils/testUtils"; import { SPLASH_ONLY } from "../utils/testUtils";
// TODO: Add more tests once Imposter is fully implemented
describe("Abilities - Imposter", () => { describe("Abilities - Imposter", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;
@ -29,9 +30,10 @@ describe("Abilities - Imposter", () => {
.enemySpecies(Species.MEW) .enemySpecies(Species.MEW)
.enemyLevel(200) .enemyLevel(200)
.enemyAbility(Abilities.BEAST_BOOST) .enemyAbility(Abilities.BEAST_BOOST)
.enemyPassiveAbility(Abilities.BALL_FETCH)
.enemyMoveset(SPLASH_ONLY) .enemyMoveset(SPLASH_ONLY)
.ability(Abilities.IMPOSTER) .ability(Abilities.IMPOSTER)
.moveset([ Moves.TACKLE ]); .moveset(SPLASH_ONLY);
}); });
it("should copy species, ability, gender, all stats except HP, all stat stages, moveset, and types of target", async () => { it("should copy species, ability, gender, all stats except HP, all stat stages, moveset, and types of target", async () => {
@ -39,7 +41,7 @@ describe("Abilities - Imposter", () => {
Species.DITTO Species.DITTO
]); ]);
game.move.select(Moves.TACKLE); game.move.select(Moves.SPLASH);
await game.phaseInterceptor.to(TurnEndPhase); await game.phaseInterceptor.to(TurnEndPhase);
const player = game.scene.getPlayerPokemon()!; const player = game.scene.getPlayerPokemon()!;

View File

@ -0,0 +1,215 @@
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import GameManager from "./utils/gameManager";
import { Species } from "#app/enums/species";
import { getPokemonSpecies } from "#app/data/pokemon-species";
import { SPLASH_ONLY } from "./utils/testUtils";
import { Abilities } from "#app/enums/abilities";
import { Moves } from "#app/enums/moves";
import { EFFECTIVE_STATS } from "#app/enums/stat";
import { EnemyPokemon } from "#app/field/pokemon";
import { toDmgValue } from "#app/utils";
describe("Boss Pokemon / Shields", () => {
const TIMEOUT = 2500;
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override
.battleType("single")
.disableTrainerWaves()
.disableCrits()
.enemySpecies(Species.RATTATA)
.enemyMoveset(SPLASH_ONLY)
.enemyHeldItems([])
.startingLevel(1000)
.moveset([Moves.FALSE_SWIPE, Moves.SUPER_FANG, Moves.SPLASH])
.ability(Abilities.NO_GUARD);
});
it("Pokemon should get shields based on their Species and level and the current wave", async () => {
let level = 50;
let wave = 5;
// On normal waves, no shields...
expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.RATTATA))).toBe(0);
// ... expect (sub)-legendary and mythical Pokemon who always get shields
expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.MEW))).toBe(2);
// Pokemon with 670+ BST get an extra shield
expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.MEWTWO))).toBe(3);
// Every 10 waves will always be a boss Pokemon with shield(s)
wave = 50;
expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.RATTATA))).toBe(2);
// Every extra 250 waves adds a shield
wave += 250;
expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.RATTATA))).toBe(3);
wave += 750;
expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.RATTATA))).toBe(6);
// Pokemon above level 100 get an extra shield
level = 100;
expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.RATTATA))).toBe(7);
}, TIMEOUT);
it("should reduce the number of shields if we are in a double battle", async () => {
game.override
.battleType("double")
.startingWave(150); // Floor 150 > 2 shields / 3 health segments
await game.classicMode.startBattle([ Species.MEWTWO ]);
const boss1: EnemyPokemon = game.scene.getEnemyParty()[0]!;
const boss2: EnemyPokemon = game.scene.getEnemyParty()[1]!;
expect(boss1.isBoss()).toBe(true);
expect(boss1.bossSegments).toBe(2);
expect(boss2.isBoss()).toBe(true);
expect(boss2.bossSegments).toBe(2);
}, TIMEOUT);
it("shields should stop overflow damage and give stat stage boosts when broken", async () => {
game.override.startingWave(150); // Floor 150 > 2 shields / 3 health segments
await game.classicMode.startBattle([ Species.MEWTWO ]);
const enemyPokemon = game.scene.getEnemyPokemon()!;
const segmentHp = enemyPokemon.getMaxHp() / enemyPokemon.bossSegments;
expect(enemyPokemon.isBoss()).toBe(true);
expect(enemyPokemon.bossSegments).toBe(3);
expect(getTotalStatStageBoosts(enemyPokemon)).toBe(0);
game.move.select(Moves.SUPER_FANG); // Enough to break the first shield
await game.toNextTurn();
// Broke 1st of 2 shields, health at 2/3rd
expect(enemyPokemon.bossSegmentIndex).toBe(1);
expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - toDmgValue(segmentHp));
// Breaking the shield gives a +1 boost to ATK, DEF, SP ATK, SP DEF or SPD
expect(getTotalStatStageBoosts(enemyPokemon)).toBe(1);
game.move.select(Moves.FALSE_SWIPE); // Enough to break last shield but not kill
await game.toNextTurn();
expect(enemyPokemon.bossSegmentIndex).toBe(0);
expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - toDmgValue(2 * segmentHp));
// Breaking the last shield gives a +2 boost to ATK, DEF, SP ATK, SP DEF or SPD
expect(getTotalStatStageBoosts(enemyPokemon)).toBe(3);
}, TIMEOUT);
it("breaking multiple shields at once requires extra damage", async () => {
game.override
.battleType("double")
.enemyHealthSegments(5);
await game.classicMode.startBattle([ Species.MEWTWO ]);
// In this test we want to break through 3 shields at once
const brokenShields = 3;
const boss1: EnemyPokemon = game.scene.getEnemyParty()[0]!;
const boss1SegmentHp = boss1.getMaxHp() / boss1.bossSegments;
const requiredDamageBoss1 = boss1SegmentHp * (1 + Math.pow(2, brokenShields));
expect(boss1.isBoss()).toBe(true);
expect(boss1.bossSegments).toBe(5);
expect(boss1.bossSegmentIndex).toBe(4);
// Not enough damage to break through all shields
boss1.damageAndUpdate(Math.floor(requiredDamageBoss1 - 5));
expect(boss1.bossSegmentIndex).toBe(1);
expect(boss1.hp).toBe(boss1.getMaxHp() - toDmgValue(boss1SegmentHp * 3));
const boss2: EnemyPokemon = game.scene.getEnemyParty()[1]!;
const boss2SegmentHp = boss2.getMaxHp() / boss2.bossSegments;
const requiredDamageBoss2 = boss2SegmentHp * (1 + Math.pow(2, brokenShields));
expect(boss2.isBoss()).toBe(true);
expect(boss2.bossSegments).toBe(5);
// Enough damage to break through all shields
boss2.damageAndUpdate(Math.ceil(requiredDamageBoss2));
expect(boss2.bossSegmentIndex).toBe(0);
expect(boss2.hp).toBe(boss2.getMaxHp() - toDmgValue(boss2SegmentHp * 4));
}, TIMEOUT);
it("the number of stat stage boosts is consistent when several shields are broken at once", async () => {
const shieldsToBreak = 4;
game.override
.battleType("double")
.enemyHealthSegments(shieldsToBreak + 1);
await game.classicMode.startBattle([ Species.MEWTWO ]);
const boss1: EnemyPokemon = game.scene.getEnemyParty()[0]!;
const boss1SegmentHp = boss1.getMaxHp() / boss1.bossSegments;
const singleShieldDamage = Math.ceil(boss1SegmentHp);
expect(boss1.isBoss()).toBe(true);
expect(boss1.bossSegments).toBe(shieldsToBreak + 1);
expect(boss1.bossSegmentIndex).toBe(shieldsToBreak);
expect(getTotalStatStageBoosts(boss1)).toBe(0);
let totalStatStages = 0;
// Break the shields one by one
for (let i = 1; i <= shieldsToBreak; i++) {
boss1.damageAndUpdate(singleShieldDamage);
expect(boss1.bossSegmentIndex).toBe(shieldsToBreak - i);
expect(boss1.hp).toBe(boss1.getMaxHp() - toDmgValue(boss1SegmentHp * i));
// Do nothing and go to next turn so that the StatStageChangePhase gets applied
game.move.select(Moves.SPLASH);
await game.toNextTurn();
// All broken shields give +1 stat boost, except the last two that gives +2
totalStatStages += i >= shieldsToBreak -1? 2 : 1;
expect(getTotalStatStageBoosts(boss1)).toBe(totalStatStages);
}
const boss2: EnemyPokemon = game.scene.getEnemyParty()[1]!;
const boss2SegmentHp = boss2.getMaxHp() / boss2.bossSegments;
const requiredDamage = boss2SegmentHp * (1 + Math.pow(2, shieldsToBreak - 1));
expect(boss2.isBoss()).toBe(true);
expect(boss2.bossSegments).toBe(shieldsToBreak + 1);
expect(boss2.bossSegmentIndex).toBe(shieldsToBreak);
expect(getTotalStatStageBoosts(boss2)).toBe(0);
// Enough damage to break all shields at once
boss2.damageAndUpdate(Math.ceil(requiredDamage));
expect(boss2.bossSegmentIndex).toBe(0);
expect(boss2.hp).toBe(boss2.getMaxHp() - toDmgValue(boss2SegmentHp * shieldsToBreak));
// Do nothing and go to next turn so that the StatStageChangePhase gets applied
game.move.select(Moves.SPLASH);
await game.toNextTurn();
expect(getTotalStatStageBoosts(boss2)).toBe(totalStatStages);
}, TIMEOUT);
/**
* Gets the sum of the effective stat stage boosts for the given Pokemon
* @param enemyPokemon the pokemon to get stats from
* @returns the total stats boosts
*/
function getTotalStatStageBoosts(enemyPokemon: EnemyPokemon): number {
let boosts = 0;
for (const s of EFFECTIVE_STATS) {
boosts += enemyPokemon.getStatStage(s);
}
return boosts;
}
});

View File

@ -27,7 +27,7 @@ describe("Moves - Fusion Flare", () => {
game.override.moveset([fusionFlare]); game.override.moveset([fusionFlare]);
game.override.startingLevel(1); game.override.startingLevel(1);
game.override.enemySpecies(Species.RESHIRAM); game.override.enemySpecies(Species.RATTATA);
game.override.enemyMoveset([Moves.REST, Moves.REST, Moves.REST, Moves.REST]); game.override.enemyMoveset([Moves.REST, Moves.REST, Moves.REST, Moves.REST]);
game.override.battleType("single"); game.override.battleType("single");

View File

@ -8,6 +8,7 @@ import { Stat, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat";
import { Abilities } from "#enums/abilities"; import { Abilities } from "#enums/abilities";
import { SPLASH_ONLY } from "../utils/testUtils"; import { SPLASH_ONLY } from "../utils/testUtils";
// TODO: Add more tests once Transform is fully implemented
describe("Moves - Transform", () => { describe("Moves - Transform", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;
@ -29,6 +30,7 @@ describe("Moves - Transform", () => {
.enemySpecies(Species.MEW) .enemySpecies(Species.MEW)
.enemyLevel(200) .enemyLevel(200)
.enemyAbility(Abilities.BEAST_BOOST) .enemyAbility(Abilities.BEAST_BOOST)
.enemyPassiveAbility(Abilities.BALL_FETCH)
.enemyMoveset(SPLASH_ONLY) .enemyMoveset(SPLASH_ONLY)
.ability(Abilities.INTIMIDATE) .ability(Abilities.INTIMIDATE)
.moveset([ Moves.TRANSFORM ]); .moveset([ Moves.TRANSFORM ]);

View File

@ -292,6 +292,20 @@ export class OverridesHelper extends GameManagerHelper {
return this; return this;
} }
/**
* Override the enemy (Pokemon) to have the given amount of health segments
* @param healthSegments the number of segments to give
* default: 0, the health segments will be handled like in the game based on wave, level and species
* 1: the Pokemon will not be a boss
* 2+: the Pokemon will be a boss with the given number of health segments
* @returns this
*/
enemyHealthSegments(healthSegments: number) {
vi.spyOn(Overrides, "OPP_HEALTH_SEGMENTS_OVERRIDE", "get").mockReturnValue(healthSegments);
this.log("Enemy Pokemon health segments set to:", healthSegments);
return this;
}
private log(...params: any[]) { private log(...params: any[]) {
console.log("Overrides:", ...params); console.log("Overrides:", ...params);
} }

View File

@ -74,7 +74,7 @@ export default class AchvsUiHandler extends MessageUiHandler {
this.headerText = addTextObject(this.scene, 0, 0, "", TextStyle.SETTINGS_LABEL); this.headerText = addTextObject(this.scene, 0, 0, "", TextStyle.SETTINGS_LABEL);
this.headerText.setOrigin(0, 0); this.headerText.setOrigin(0, 0);
this.headerText.setPositionRelative(this.headerBg, 8, 4); this.headerText.setPositionRelative(this.headerBg, 8, 4);
this.headerActionButton = new Phaser.GameObjects.Sprite(this.scene, 0, 0, "keyboard", "SPACE.png"); this.headerActionButton = new Phaser.GameObjects.Sprite(this.scene, 0, 0, "keyboard", "ACTION.png");
this.headerActionButton.setOrigin(0, 0); this.headerActionButton.setOrigin(0, 0);
this.headerActionButton.setPositionRelative(this.headerBg, 236, 6); this.headerActionButton.setPositionRelative(this.headerBg, 236, 6);
this.headerActionText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, {fontSize:"60px"}); this.headerActionText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, {fontSize:"60px"});

View File

@ -1321,16 +1321,13 @@ class PartySlot extends Phaser.GameObjects.Container {
this.slotHpOverlay.setVisible(false); this.slotHpOverlay.setVisible(false);
this.slotHpText.setVisible(false); this.slotHpText.setVisible(false);
let slotTmText: string; let slotTmText: string;
switch (true) {
case (this.pokemon.compatibleTms.indexOf(tmMoveId) === -1): if (this.pokemon.getMoveset().filter(m => m?.moveId === tmMoveId).length > 0) {
slotTmText = i18next.t("partyUiHandler:notAble");
break;
case (this.pokemon.getMoveset().filter(m => m?.moveId === tmMoveId).length > 0):
slotTmText = i18next.t("partyUiHandler:learned"); slotTmText = i18next.t("partyUiHandler:learned");
break; } else if (this.pokemon.compatibleTms.indexOf(tmMoveId) === -1) {
default: slotTmText = i18next.t("partyUiHandler:notAble");
} else {
slotTmText = i18next.t("partyUiHandler:able"); slotTmText = i18next.t("partyUiHandler:able");
break;
} }
this.slotDescriptionLabel.setText(slotTmText); this.slotDescriptionLabel.setText(slotTmText);