Compare commits

...

11 Commits

Author SHA1 Message Date
Xavion3
4b36d38acb
Hotfix for NaN luck (#1840)
Makes luck default to 0 if false-y
2024-06-05 20:42:15 +01:00
Matthew Olker
3855b92237 fix weird luck when catching a fused mon 2024-06-05 15:41:04 -04:00
José Ricardo Fleury Oliveira
4a9fe763a5
[ptBR] Translated text (#1821)
* translated disclaimer

* minor fix
2024-06-05 12:44:48 -05:00
YounesM
e614aec8ca
[Bug] Fix for Dancer activating when enemy in not on field / using a 2 steps charging move (#1708)
* Fixes !1686 and !1450

* Added forbidden tags

* Restored original import indentations

* Restored missing import
2024-06-05 13:10:24 -04:00
Matthew Olker
b532a6b2d0 okay not that lucky 2024-06-05 11:21:47 -04:00
Matthew Olker
6d71db0f13 luck based encounter 2024-06-05 11:02:58 -04:00
NightKev
395fa6e33d
[Bug] Allow second mon of a fusion to learn/remember on-evo moves (#1778)
Fixes #520
2024-06-05 10:36:42 -04:00
GoldTra
dce4518b93
Updated Spanish translations (#1825) 2024-06-05 09:24:33 -05:00
Frede
fe732bbbe6
[QoL] Pokemon Info Container hides Enemy Modifier Bar (#1820)
* Added "Skip Dialogues" option (if at least 1 classic win)

* Removed error sound and hide option instead when classic wins = 0

* Add skip dialogues option to Unlockables and show unlocked message on first classic win

* Only skips seen dialogues, removed dialogue option from unlockables, seen dialogues get saved to local storage

* oops

* dont show charSprite when skipping a dialogue, small fixes

* pokemonInfoContainer always on top of battle UI when shown

* removed setDepth and rather hide enemyModifierBar

---------

Co-authored-by: Frederik Hobein <frederik.hobein@nterra.com>
2024-06-05 10:09:06 -04:00
Lee ByungHoon
e599931ff3
[Localization] Add Korean trainer dialogue (youngster, lass) (#1809)
* [Localization] #1761 Korean trainer dialogue (youngster, lass)

* changed ellipsis character that used 3 character to used 1 character.

* Update src/locales/ko/dialogue.ts

Co-authored-by: returntoice <dieandbecome@gmail.com>

* Update src/locales/ko/dialogue.ts

Co-authored-by: returntoice <dieandbecome@gmail.com>

* Update src/locales/ko/dialogue.ts

Co-authored-by: returntoice <dieandbecome@gmail.com>

---------

Co-authored-by: returntoice <dieandbecome@gmail.com>
2024-06-05 10:00:43 -04:00
Adrian T
bd34fc0b47
[Bug] Fix quick claw message showing if command is not fight (#1819) 2024-06-05 09:38:43 -04:00
13 changed files with 97 additions and 66 deletions

View File

@ -1313,6 +1313,14 @@ export default class BattleScene extends SceneBase {
});
}
showEnemyModifierBar(): void {
this.enemyModifierBar.setVisible(true);
}
hideEnemyModifierBar(): void {
this.enemyModifierBar.setVisible(false);
}
updateBiomeWaveText(): void {
const isBoss = !(this.currentBattle.waveIndex % 10);
const biomeString: string = getBiomeName(this.arena.biomeType);
@ -1418,7 +1426,7 @@ export default class BattleScene extends SceneBase {
randomSpecies(waveIndex: integer, level: integer, fromArenaPool?: boolean, speciesFilter?: PokemonSpeciesFilter, filterAllEvolutions?: boolean): PokemonSpecies {
if (fromArenaPool) {
return this.arena.randomSpecies(waveIndex, level);
return this.arena.randomSpecies(waveIndex, level,null , getPartyLuckValue(this.party));
}
const filteredSpecies = speciesFilter ? [...new Set(allSpecies.filter(s => s.isCatchable()).filter(speciesFilter).map(s => {
if (!filterAllEvolutions) {

View File

@ -2462,7 +2462,7 @@ export class PostTurnStatusHealAbAttr extends PostTurnAbAttr {
* @returns Returns true if healed from status, false if not
*/
applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise<boolean> {
if (this.effects.includes(pokemon.status.effect)) {
if (this.effects.includes(pokemon.status?.effect)) {
if (pokemon.getMaxHp() !== pokemon.hp) {
const scene = pokemon.scene;
const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name;
@ -2764,8 +2764,12 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr {
* @return true if the Dancer ability was resolved
*/
applyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], args: any[]): boolean | Promise<boolean> {
// List of tags that prevent the Dancer from replicating the move
const forbiddenTags = [BattlerTagType.FLYING, BattlerTagType.UNDERWATER,
BattlerTagType.UNDERGROUND, BattlerTagType.HIDDEN];
// The move to replicate cannot come from the Dancer
if (source.getBattlerIndex() !== dancer.getBattlerIndex()) {
if (source.getBattlerIndex() !== dancer.getBattlerIndex()
&& !dancer.summonData.tags.some(tag => forbiddenTags.includes(tag.tagType))) {
// If the move is an AttackMove or a StatusMove the Dancer must replicate the move on the source of the Dance
if (move.getMove() instanceof AttackMove || move.getMove() instanceof StatusMove) {
const target = this.getTarget(dancer, source, targets);
@ -2774,9 +2778,10 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr {
// If the move is a SelfStatusMove (ie. Swords Dance) the Dancer should replicate it on itself
dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, [dancer.getBattlerIndex()], move, true));
}
}
return true;
}
return false;
}
/**
* Get the correct targets of Dancer ability

View File

@ -68,14 +68,20 @@ export class Arena {
}
}
randomSpecies(waveIndex: integer, level: integer, attempt?: integer): PokemonSpecies {
randomSpecies(waveIndex: integer, level: integer, attempt?: integer, luckValue?: integer): PokemonSpecies {
const overrideSpecies = this.scene.gameMode.getOverrideSpecies(waveIndex);
if (overrideSpecies) {
return overrideSpecies;
}
const isBoss = !!this.scene.getEncounterBossSegments(waveIndex, level) && !!this.pokemonPool[BiomePoolTier.BOSS].length
&& (this.biomeType !== Biome.END || this.scene.gameMode.isClassic || this.scene.gameMode.isWaveFinal(waveIndex));
const tierValue = Utils.randSeedInt(!isBoss ? 512 : 64);
const randVal = isBoss ? 64 : 512;
// luck influences encounter rarity
let luckModifier = 0;
if (typeof luckValue !== "undefined") {
luckModifier = luckValue * (isBoss ? 0.5 : 2);
}
const tierValue = Utils.randSeedInt(randVal - luckModifier);
let tier = !isBoss
? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE
: tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE;

View File

@ -1168,6 +1168,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (this.fusionSpecies) {
const evolutionLevelMoves = levelMoves.slice(0, Math.max(levelMoves.findIndex(lm => !!lm[0]), 0));
const fusionLevelMoves = this.getFusionSpeciesForm(true).getLevelMoves();
const fusionEvolutionLevelMoves = fusionLevelMoves.slice(0, Math.max(fusionLevelMoves.findIndex(flm => !!flm[0]), 0));
const newLevelMoves: LevelMoves = [];
while (levelMoves.length && levelMoves[0][0] < startingLevel) {
levelMoves.shift();
@ -1179,6 +1180,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
for (const elm of evolutionLevelMoves.reverse()) {
levelMoves.unshift(elm);
}
for (const felm of fusionEvolutionLevelMoves.reverse()) {
fusionLevelMoves.unshift(felm);
}
}
for (let l = includeEvolutionMoves ? 0 : startingLevel; l <= this.level; l++) {
if (l === 1 && startingLevel > 1) {

View File

@ -1,11 +1,11 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const pokemonInfoContainer: SimpleTranslationEntries = {
"moveset": "Moveset",
"gender": "Gender:",
"ability": "Ability:",
"nature": "Nature:",
"epic": "Epic",
"rare": "Rare",
"common": "Common"
"moveset": "Movimientos",
"gender": "Género:",
"ability": "Habilid:",
"nature": "Natur:",
"epic": "Épico",
"rare": "Raro",
"common": "Común"
} as const;

View File

@ -4,58 +4,58 @@ import { DialogueTranslationEntries, SimpleTranslationEntries } from "#app/plugi
export const PGMdialogue: DialogueTranslationEntries = {
"youngster": {
"encounter": {
1: "Hey, wanna battle?",
2: "Are you a new trainer too?",
3: "Hey, I haven't seen you before. Let's battle!",
4: "I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!",
5: "Have we met or not? I don't really remember. Well, I guess it's nice to meet you anyway!",
6: "All right! Let's go!",
7: "All right! Here I come! I'll show you my power!",
8: "Haw haw haw... I'll show you how hawesome my Pokémon are!",
9: "No need to waste time saying hello. Bring it on whenever you're ready!",
10: "Don't let your guard down, or you may be crying when a kid beats you.",
11: "I've raised my Pokémon with great care. You're not allowed to hurt them!",
12: "Glad you made it! It won't be an easy job from here.",
13: "The battles continue forever! Welcome to the world with no end!"
1: "거기 너! 나와 배틀 어때?",
2: "넌 새내기 트레이너구나. 맞지?",
3: "거기 너! 처음보는 얼굴인데? 나랑 배틀하자!",
4: "방금 배틀에서 져서 새로운 포켓몬을 찾는 중이야.\n잠깐! 넌 약해보이는데? 어서 나와 배틀하자!",
5: "우리 만난 적이 있었던가? 잘 기억은 안나지만 어쨌든 만나서 반가워!",
6: "좋아! 시작하자!",
7: "좋아! 내가 왔다! 내 힘을 보여주지!",
8: "하하하… 내 포켓몬이 얼마나 멋진지 보여주겠어!",
9: "인사할 시간도 없어. 준비가 되었다면 이리 와!",
10: "긴장을 늦추지마. 그렇지 않으면 어린이에게 맞아 울지도 몰라.",
11: "난 내 포켓몬들을 소중히 키웠어. 내 포켓몬에게 상처를 입히게 놔두지 않겠어!",
12: "여기까지 잘 왔구나! 하지만 지금부턴 쉽지 않을거야.",
13: "배틀은 끝나지 않아! 끝없는 배틀의 세계에 온 것을 환영해!"
},
"victory": {
1: "Wow! You're strong!",
2: "I didn't stand a chance, huh?",
3: "I'll find you again when I'm older and beat you!",
4: "Ugh. I don't have any more Pokémon.",
5: "No way… NO WAY! How could I lose again…",
6: "No! I lost!",
7: "Whoa! You are incredible! I'm amazed and surprised!",
8: "Could it be… How… My Pokémon and I are the strongest, though…",
9: "I won't lose next time! Let's battle again sometime!",
10: "Sheesh! Can't you see that I'm just a kid! It wasn't fair of you to go all out like that!",
11: "Your Pokémon are more amazing! Trade with me!",
12: "I got a little carried away earlier, but what job was I talking about?",
13: "Ahaha! There it is! That's right! You're already right at home in this world!"
1: "우와! 넌 강하구나!",
2: "하? 난 기회가 없었어.",
3: "내가 조금 더 큰 다음엔 널 찾아서 때리겠어!",
4: "으.. 더이상 가지고 있는 포켓몬이 없어.",
5: "말도 안돼… 안돼! 내가 또 지다니…",
6: "안돼! 내가 지다니!",
7: "우와! 정말 깜짝 놀랐어! 넌 정말 강하구나!",
8: "이럴수가… 내 포켓몬과 난 최강인데… 어떻게…",
9: "다음엔 지지 않을거야! 다음에 다시 배틀하자!",
10: "쳇! 내가 어린애인게 보이지 않아?! 그렇게 최선을 다하는건 불공평해!",
11: "네 포켓몬은 정말 굉장하구나! 나와 교환하자!",
12: "내가 잠깐 정신이 나갔었나 봐. 내가 무슨 말을 하고 있었지?",
13: "아하! 거기구나! 좋아! 넌 이미 이 세계에 머무를 곳이 있구나!"
}
},
"lass": {
"encounter": {
1: "Let's have a battle, shall we?",
2: "You look like a new trainer. Let's have a battle!",
3: "I don't recognize you. How about a battle?",
4: "Let's have a fun Pokémon battle!",
5: "I'll show you the ropes of how to really use Pokémon!",
6: "A serious battle starts from a serious beginning! Are you sure you're ready?",
7: "You're only young once. And you only get one shot at a given battle. Soon, you'll be nothing but a memory.",
8: "You'd better go easy on me, OK? Though I'll be seriously fighting!",
9: "School is boring. I've got nothing to do. Yawn. I'm only battling to kill the time."
1: "나랑 배틀하자, 어때?",
2: "넌 신입 트레이너구나. 나랑 배틀하자!",
3: "너 거기 있었구나? 나랑 배틀할래?",
4: "재밌는 포켓몬 배틀하자!",
5: "내가 포켓몬을 어떻게 다뤄야하는지 보여줄게!",
6: "진정한 배틀은 진지한 자세부터 시작이야! 준비됐어?",
7: "젊음이 한순간이듯 배틀에서 네 기회도 단 한번만 주어질거야. 곧 넌 추억속으로 사라질거야.",
8: "나에겐 살살해도 돼, 알았지? 그래도 난 진지하게 싸울거야!",
9: "학교는 지겨워. 나는 할 일이 없어. 하암~ 난 그저 시간을 때우기 위해 싸울뿐이야."
},
"victory": {
1: "That was impressive! I've got a lot to learn.",
2: "I didn't think you'd beat me that bad…",
3: "I hope we get to have a rematch some day.",
4: "That was pretty amazingly fun! You've totally exhausted me…",
5: "You actually taught me a lesson! You're pretty amazing!",
6: "Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.",
7: "I don't need memories like this. Deleting memory…",
8: "Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.",
9: "I'm actually getting tired of battling… There's gotta be something new to do…"
1: "인상적이었어! 난 아직 배울게 많구나.",
2: "내가 이렇게까지 크게 질 줄은 몰랐어…",
3: "언젠가 우리가 다시 배틀할 수 있을 날을 기다릴게.",
4: "놀라울 정도로 엄청 재미있었어! 넌 날 완전히 지치게 만들어버렸네…",
5: "넌 나에게 진짜 교훈을 주었어! 넌 정말 대단해!",
6: "세상에, 내가 지다니. 이거 정말 우울하지만… 넌 정말 멋있었어.",
7: "난 이런 기억따윈 필요없어. 잊어버리겠어…",
8: "거기 너! 살살하라고 했지! 그래도 넌 진지할때 정말 멋지구나!",
9: "사실 배틀하는 것이 지루하던 참이야… 뭔가 새로운 것이 없을까?"
}
},
"breeder": {

View File

@ -27,7 +27,7 @@ export const gameStatsUiHandler: SimpleTranslationEntries = {
"subLegendsHatched": "Sub-Lendários Chocados",
"legendsSeen": "Lendários Vistos",
"legendsCaught": "Lendários Capturados",
"legendsHatched": "Legendários Chocados",
"legendsHatched": "Lendários Chocados",
"mythicalsSeen": "Míticos Vistos",
"mythicalsCaught": "Míticos Capturados",
"mythicalsHatched": "Míticos Chocados",

View File

@ -49,6 +49,6 @@ export const menu: SimpleTranslationEntries = {
"empty": "Vazio",
"yes": "Sim",
"no": "Não",
"disclaimer": "DISCLAIMER",
"disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed."
"disclaimer": "AVISO",
"disclaimerDescription": "Este jogo é um produto inacabado; ele pode ter problemas de jogabilidade (incluindo possíveis perdas de dados salvos),\n sofrer alterações sem aviso prévio e pode ou não ser atualizado ou concluído."
} as const;

View File

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

View File

@ -22,6 +22,7 @@ import { Nature } from "#app/data/nature";
import { BattlerTagType } from "#app/data/enums/battler-tag-type";
import * as Overrides from "../overrides";
import { ModifierType, modifierTypes } from "./modifier-type";
import { Command } from "#app/ui/command-ui-handler.js";
export type ModifierPredicate = (modifier: Modifier) => boolean;
@ -776,7 +777,10 @@ export class BypassSpeedChanceModifier extends PokemonHeldItemModifier {
if (!bypassSpeed.value && pokemon.randSeedInt(10) < this.getStackCount()) {
bypassSpeed.value = true;
if (this.type instanceof ModifierTypes.PokemonHeldItemModifierType && this.type.id === "QUICK_CLAW") {
const isCommandFight = pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()]?.command === Command.FIGHT;
const hasQuickClaw = this.type instanceof ModifierTypes.PokemonHeldItemModifierType && this.type.id === "QUICK_CLAW";
if (isCommandFight && hasQuickClaw) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " used its quick claw to move faster!"));
}
return true;

View File

@ -2583,7 +2583,7 @@ export class MovePhase extends BattlePhase {
this.scene.getPlayerField().forEach(pokemon => {
applyPostMoveUsedAbAttrs(PostMoveUsedAbAttr, pokemon, this.move, this.pokemon, this.targets);
});
this.scene.getEnemyParty().forEach(pokemon => {
this.scene.getEnemyField().forEach(pokemon => {
applyPostMoveUsedAbAttrs(PostMoveUsedAbAttr, pokemon, this.move, this.pokemon, this.targets);
});
}

View File

@ -262,6 +262,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
this.setVisible(true);
this.shown = true;
this.scene.hideEnemyModifierBar();
});
}
@ -282,6 +283,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
hide(speedMultiplier: number = 1): Promise<void> {
return new Promise(resolve => {
if (!this.shown) {
this.scene.showEnemyModifierBar();
return resolve();
}
@ -302,6 +304,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
this.pokemonShinyIcon.off("pointerover");
this.pokemonShinyIcon.off("pointerout");
(this.scene as BattleScene).ui.hideTooltip();
this.scene.showEnemyModifierBar();
resolve();
}
});