mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-07-13 20:02:19 +02:00
Compare commits
11 Commits
4b8c9c87c3
...
e37b278b4f
Author | SHA1 | Date | |
---|---|---|---|
|
e37b278b4f | ||
|
0780211901 | ||
|
1f432cf5c0 | ||
|
fcdac63759 | ||
|
578717aab1 | ||
|
f0cf5cbb19 | ||
|
bf06ce6340 | ||
|
5512be8f31 | ||
|
d835cfd13f | ||
|
77b59a1cef | ||
|
89f58961cb |
30
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
30
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: "[BUG]"
|
||||
labels: Bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
<!-- A clear and concise description of what the bug is. -->
|
||||
|
||||
**To Reproduce**
|
||||
<!-- Steps to reproduce the behavior: -->
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
<!-- A clear and concise description of what you expected to happen. If it is an existing move or ability -->
|
||||
|
||||
**Screenshots / Videos**
|
||||
<!-- If applicable, add screenshots or videos to help explain your problem. -->
|
||||
|
||||
**Device**
|
||||
<!-- What browser are you playing in, are you on a PC/Mac or Phone? -->
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context about the problem here. -->
|
18
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
18
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: "[Feature]"
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
||||
|
||||
**Describe the Feature**
|
||||
<!-- A clear and concise description of what you want to happen. -->
|
||||
<!-- Add a link to the feature if it is an existing move/ability/etc -->
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context or screenshots about the feature request here. -->
|
34
.github/pull_request_template.md
vendored
Normal file
34
.github/pull_request_template.md
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
<!-- Make sure the title includes categorization (i.e. [Bug], [QoL], [Localization]) -->
|
||||
<!-- Make sure that this PR is not overlapping with someone else's work -->
|
||||
<!-- Please try to keep the PR self-contained (and small) -->
|
||||
|
||||
## What are the changes?
|
||||
<!-- Summarize what are the changes from a user perspective on the application -->
|
||||
|
||||
## Why am I doing these changes?
|
||||
<!-- Explain why you decided to introduce these changes -->
|
||||
<!-- Does it come from an issue or another PR? Please link it -->
|
||||
<!-- Explain why you believe this can enhance user experience -->
|
||||
|
||||
## What did change?
|
||||
<!-- Explicitly state what are the changes introduced by the PR -->
|
||||
<!-- You can make use of a comparison between what was the state before and after your PR changes -->
|
||||
|
||||
### Screenshots/Videos
|
||||
<!-- If your change is changing anything on the user experience, please provide visual proofs of it -->
|
||||
<!-- Please take screenshots/videos before and after your changes, to show what is brought by this PR -->
|
||||
|
||||
## How to test the changes?
|
||||
<!-- How can a reviewer test your changes once they check out on your branch? -->
|
||||
<!-- Did you just make use of the `src/overrides.ts` file? -->
|
||||
<!-- Did you introduce any automated tests? -->
|
||||
<!-- Do the reviewer need to do something special in order to test your change? -->
|
||||
|
||||
## Checklist
|
||||
- [ ] There is no overlap with another PR?
|
||||
- [ ] The PR is self-contained and cannot be split into smaller PRs?
|
||||
- [ ] Have I provided a clear explanation of the changes?
|
||||
- [ ] Have I tested the changes (manually)?
|
||||
- [ ] Are all unit tests still passing? (`npm run test`)
|
||||
- [ ] Are the changes visual?
|
||||
- [ ] Have I provided screenshots/videos of the changes?
|
64
docs/comments.md
Normal file
64
docs/comments.md
Normal file
@ -0,0 +1,64 @@
|
||||
## How do I comment my code?
|
||||
|
||||
### While we're not enforcing a strict standard, there are some things to keep in mind:
|
||||
- Make comments meaningful
|
||||
- Comments should be explaining why a line or block of code exists and what the reason behind it is
|
||||
- Comments should not be repeating chunks of code or explaining what 'true' and 'false' means in typescript
|
||||
- Make sure comments exist on Functions, Classes, Methods, and Properties
|
||||
- This may be the most important things to comment. When someone goes to use a function/class/method/etc., having a comment reduces the need to flip back and forth between files to figure out how something works. Peek Definition is great until you're three nested functions deep.
|
||||
- The best example of this is JSDoc-style comments as seen below:
|
||||
- When formatted this way, the comment gets shown by intellisense in VS Code or similar IDEs just by hovering over the text!
|
||||
- Functions also show each the comment for parameter as you type them, making keeping track of what each one does in lengthy functions much more clear
|
||||
```js
|
||||
/**
|
||||
* Changes the type-based weather modifier if this move's power would be reduced by it
|
||||
* @param user {@linkcode Pokemon} using this move
|
||||
* @param target {@linkcode Pokemon} target of this move
|
||||
* @param move {@linkcode Move} being used
|
||||
* @param args [0] {@linkcode Utils.NumberHolder} for arenaAttackTypeMultiplier
|
||||
* @returns true if the function succeeds
|
||||
*/
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
}
|
||||
|
||||
/** Set to true when experimental animated sprites from Gen6+ are used */
|
||||
public experimentalSprites: boolean = false;
|
||||
|
||||
/**
|
||||
* Cures the user's party of non-volatile status conditions, ie. Heal Bell, Aromatherapy
|
||||
* @extends MoveAttr
|
||||
* @see {@linkcode apply}
|
||||
*/
|
||||
export class DontHealThePartyPlsAttr extends MoveAttr {
|
||||
}
|
||||
```
|
||||
You'll notice this contains an `{@linkcode Object}` tag for each parameter. This provides an easy type denomination and hyperlink to that type using VS Code's Intellisense. `@linkcode` is used instead of `@link` so that the text appears in monospace which is more obviously a `type` rather than a random hyperlink.
|
||||
|
||||
If you're interested in going more in depth, you can find a reference guide for how comments like these work [here](https://jsdoc.app)
|
||||
|
||||
### What not to do:
|
||||
- Don't leave comments for code you don't understand
|
||||
- Incorrect information is worse than no information. If you aren't sure how something works, don't make something up to explain it. Ask for help instead.
|
||||
- Don't over-comment
|
||||
- Not everything needs an explanation. Try to summarize blocks of code instead of singular lines where possible. Single line comments should call out specific oddities.
|
||||
|
||||
## How do Abilities and Moves differ from other classes?
|
||||
While other classes should be fully documented, Abilities and Moves heavily incoperate inheritance (i.e. the `extends` keyword). Because of this, much of the functionality in these classes is duplicated or only slightly changed between classes.
|
||||
### With this in mind, there's a few more things to keep in mind for these:
|
||||
- Do not document any parameters if the function mirrors the one they extend.
|
||||
- Keep this in mind for functions that are not the `apply` function as they are usually sparce and mostly reused
|
||||
- The class itself must be documented
|
||||
- This must include the `@extends BaseClass` and `@see {@linkcode apply}` tags
|
||||
- Class member variables must be documented
|
||||
- You can use a single line documentation comment for these `/** i.e. a comment like this */`
|
||||
- `args` parameters must be documented if used
|
||||
- This should look something like this when there are multiple:
|
||||
```ts
|
||||
/**
|
||||
...
|
||||
* @param args [0] {@linkcode Utils.NumberHolder} of arenaAttackTypeMultiplier
|
||||
* [1] {@linkcode Utils.BooleanHolder} of cancelled
|
||||
* [2] {@linkcode Utils.BooleanHolder} of rWeDoneYet
|
||||
...
|
||||
*/
|
||||
```
|
@ -17,7 +17,7 @@ import { Moves } from "./data/enums/moves";
|
||||
import { allMoves } from "./data/move";
|
||||
import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getPartyLuckValue } from "./modifier/modifier-type";
|
||||
import AbilityBar from "./ui/ability-bar";
|
||||
import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, IncrementMovePriorityAbAttr, applyAbAttrs } from "./data/ability";
|
||||
import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, IncrementMovePriorityAbAttr, PostBattleInitAbAttr, applyAbAttrs, applyPostBattleInitAbAttrs } from "./data/ability";
|
||||
import { allAbilities } from "./data/ability";
|
||||
import Battle, { BattleType, FixedBattleConfig, fixedBattles } from "./battle";
|
||||
import { GameMode, GameModes, gameModes } from "./game-mode";
|
||||
@ -979,6 +979,7 @@ export default class BattleScene extends SceneBase {
|
||||
if (pokemon) {
|
||||
if (resetArenaState) {
|
||||
pokemon.resetBattleData();
|
||||
applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon, true);
|
||||
}
|
||||
this.triggerPokemonFormChange(pokemon, SpeciesFormChangeTimeOfDayTrigger);
|
||||
}
|
||||
|
@ -1753,6 +1753,39 @@ export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribute for form changes that occur on switching out
|
||||
* @extends PreSwitchOutAbAttr
|
||||
* @see {@linkcode applyPreSwitchOut}
|
||||
*/
|
||||
export class PreSwitchOutFormChangeAbAttr extends PreSwitchOutAbAttr {
|
||||
private formFunc: (p: Pokemon) => integer;
|
||||
|
||||
constructor(formFunc: ((p: Pokemon) => integer)) {
|
||||
super();
|
||||
|
||||
this.formFunc = formFunc;
|
||||
}
|
||||
|
||||
/**
|
||||
* On switch out, trigger the form change to the one defined in the ability
|
||||
* @param pokemon The pokemon switching out and changing form {@linkcode Pokemon}
|
||||
* @param passive N/A
|
||||
* @param args N/A
|
||||
* @returns true if the form change was successful
|
||||
*/
|
||||
applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise<boolean> {
|
||||
const formIndex = this.formFunc(pokemon);
|
||||
if (formIndex !== pokemon.formIndex) {
|
||||
pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export class PreStatChangeAbAttr extends AbAttr {
|
||||
applyPreStatChange(pokemon: Pokemon, passive: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise<boolean> {
|
||||
return false;
|
||||
@ -3038,7 +3071,7 @@ export class MoneyAbAttr extends PostBattleAbAttr {
|
||||
function applyAbAttrsInternal<TAttr extends AbAttr>(attrType: { new(...args: any[]): TAttr },
|
||||
pokemon: Pokemon, applyFunc: AbAttrApplyFunc<TAttr>, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise<void> {
|
||||
return new Promise(resolve => {
|
||||
if (!pokemon.canApplyAbility(passive)) {
|
||||
if (!pokemon.canApplyAbility(passive, args[0])) {
|
||||
if (!passive) {
|
||||
return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve());
|
||||
} else {
|
||||
@ -3712,7 +3745,7 @@ export function initAbilities() {
|
||||
.attr(PostDefendContactDamageAbAttr, 8)
|
||||
.bypassFaint(),
|
||||
new Ability(Abilities.ZEN_MODE, 5)
|
||||
.attr(PostBattleInitFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 1 : 0)
|
||||
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
||||
.attr(PostSummonFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 1 : 0)
|
||||
.attr(PostTurnFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 1 : 0)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
@ -3810,7 +3843,7 @@ export function initAbilities() {
|
||||
new Ability(Abilities.MERCILESS, 7)
|
||||
.attr(ConditionalCritAbAttr, (user, target, move) => target.status?.effect === StatusEffect.TOXIC || target.status?.effect === StatusEffect.POISON),
|
||||
new Ability(Abilities.SHIELDS_DOWN, 7)
|
||||
.attr(PostBattleInitFormChangeAbAttr, p => p.formIndex % 7 + (p.getHpRatio() <= 0.5 ? 7 : 0))
|
||||
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
||||
.attr(PostSummonFormChangeAbAttr, p => p.formIndex % 7 + (p.getHpRatio() <= 0.5 ? 7 : 0))
|
||||
.attr(PostTurnFormChangeAbAttr, p => p.formIndex % 7 + (p.getHpRatio() <= 0.5 ? 7 : 0))
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
@ -3843,7 +3876,7 @@ export function initAbilities() {
|
||||
new Ability(Abilities.SURGE_SURFER, 7)
|
||||
.conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), BattleStatMultiplierAbAttr, BattleStat.SPD, 2),
|
||||
new Ability(Abilities.SCHOOLING, 7)
|
||||
.attr(PostBattleInitFormChangeAbAttr, p => p.level < 20 || p.getHpRatio() <= 0.25 ? 0 : 1)
|
||||
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
||||
.attr(PostSummonFormChangeAbAttr, p => p.level < 20 || p.getHpRatio() <= 0.25 ? 0 : 1)
|
||||
.attr(PostTurnFormChangeAbAttr, p => p.level < 20 || p.getHpRatio() <= 0.25 ? 0 : 1)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
@ -3853,7 +3886,7 @@ export function initAbilities() {
|
||||
new Ability(Abilities.DISGUISE, 7)
|
||||
.attr(PreDefendMovePowerToOneAbAttr, (target, user, move) => target.formIndex === 0 && target.getAttackTypeEffectiveness(move.type, user) > 0)
|
||||
.attr(PostSummonFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
|
||||
.attr(PostBattleInitFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
|
||||
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
||||
.attr(PostDefendFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
|
||||
.attr(PreDefendFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
|
||||
.attr(PostDefendDisguiseAbAttr)
|
||||
@ -3865,13 +3898,14 @@ export function initAbilities() {
|
||||
.ignorable()
|
||||
.partial(),
|
||||
new Ability(Abilities.BATTLE_BOND, 7)
|
||||
.attr(PostVictoryFormChangeAbAttr, p => p.getFormKey() ? 2 : 1)
|
||||
.attr(PostVictoryFormChangeAbAttr, () => 2)
|
||||
.attr(PostBattleInitFormChangeAbAttr, () => 1)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
.attr(UnswappableAbilityAbAttr)
|
||||
.attr(UnsuppressableAbilityAbAttr)
|
||||
.attr(NoFusionAbilityAbAttr),
|
||||
new Ability(Abilities.POWER_CONSTRUCT, 7) // TODO: 10% Power Construct Zygarde isn't accounted for yet. If changed, update Zygarde's getSpeciesFormIndex entry accordingly
|
||||
.attr(PostBattleInitFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === "complete" ? 4 : 2)
|
||||
.attr(PostBattleInitFormChangeAbAttr, () => 2)
|
||||
.attr(PostSummonFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === "complete" ? 4 : 2)
|
||||
.attr(PostTurnFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === "complete" ? 4 : 2)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
@ -4103,7 +4137,8 @@ export function initAbilities() {
|
||||
.attr(UnsuppressableAbilityAbAttr)
|
||||
.attr(NoTransformAbilityAbAttr)
|
||||
.attr(NoFusionAbilityAbAttr)
|
||||
.unimplemented(),
|
||||
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
||||
.attr(PreSwitchOutFormChangeAbAttr, () => 1),
|
||||
new Ability(Abilities.COMMANDER, 9)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
.attr(UnswappableAbilityAbAttr)
|
||||
@ -4186,22 +4221,26 @@ export function initAbilities() {
|
||||
.attr(PostBattleInitStatChangeAbAttr, BattleStat.SPD, 1, true)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
.attr(UnswappableAbilityAbAttr)
|
||||
.attr(NoTransformAbilityAbAttr),
|
||||
.attr(NoTransformAbilityAbAttr)
|
||||
.partial(),
|
||||
new Ability(Abilities.EMBODY_ASPECT_WELLSPRING, 9)
|
||||
.attr(PostBattleInitStatChangeAbAttr, BattleStat.SPDEF, 1, true)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
.attr(UnswappableAbilityAbAttr)
|
||||
.attr(NoTransformAbilityAbAttr),
|
||||
.attr(NoTransformAbilityAbAttr)
|
||||
.partial(),
|
||||
new Ability(Abilities.EMBODY_ASPECT_HEARTHFLAME, 9)
|
||||
.attr(PostBattleInitStatChangeAbAttr, BattleStat.ATK, 1, true)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
.attr(UnswappableAbilityAbAttr)
|
||||
.attr(NoTransformAbilityAbAttr),
|
||||
.attr(NoTransformAbilityAbAttr)
|
||||
.partial(),
|
||||
new Ability(Abilities.EMBODY_ASPECT_CORNERSTONE, 9)
|
||||
.attr(PostBattleInitStatChangeAbAttr, BattleStat.DEF, 1, true)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
.attr(UnswappableAbilityAbAttr)
|
||||
.attr(NoTransformAbilityAbAttr),
|
||||
.attr(NoTransformAbilityAbAttr)
|
||||
.partial(),
|
||||
new Ability(Abilities.TERA_SHIFT, 9)
|
||||
.attr(PostSummonFormChangeAbAttr, p => p.getFormKey() ? 0 : 1)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
|
@ -250,7 +250,7 @@ export const trainerTypeDialogue = {
|
||||
"dialogue:battle_girl.encounter.1",
|
||||
],
|
||||
victory: [
|
||||
"dialogue.battle_girl.victory.1",
|
||||
"dialogue:battle_girl.victory.1",
|
||||
]
|
||||
}
|
||||
],
|
||||
|
@ -570,6 +570,10 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
new SpeciesFormChange(Species.GRENINJA, "battle-bond", "ash", new SpeciesFormChangeManualTrigger(), true),
|
||||
new SpeciesFormChange(Species.GRENINJA, "ash", "battle-bond", new SpeciesFormChangeManualTrigger(), true)
|
||||
],
|
||||
[Species.PALAFIN] : [
|
||||
new SpeciesFormChange(Species.PALAFIN, "zero", "hero", new SpeciesFormChangeManualTrigger(), true),
|
||||
new SpeciesFormChange(Species.PALAFIN, "hero", "zero", new SpeciesFormChangeManualTrigger(), true)
|
||||
],
|
||||
[Species.AEGISLASH]: [
|
||||
new SpeciesFormChange(Species.AEGISLASH, "blade", "shield", new SpeciesFormChangePreMoveTrigger(Moves.KINGS_SHIELD), true, new SpeciesFormChangeCondition(p => p.hasAbility(Abilities.STANCE_CHANGE))),
|
||||
new SpeciesFormChange(Species.AEGISLASH, "shield", "blade", new SpeciesFormChangePreMoveTrigger(m => allMoves[m].category !== MoveCategory.STATUS), true, new SpeciesFormChangeCondition(p => p.hasAbility(Abilities.STANCE_CHANGE))),
|
||||
|
@ -962,7 +962,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
* @param {boolean} passive If true, check if passive can be applied instead of non-passive
|
||||
* @returns {Ability} The passive ability of the pokemon
|
||||
*/
|
||||
canApplyAbility(passive: boolean = false): boolean {
|
||||
canApplyAbility(passive: boolean = false, forceBypass: boolean = false): boolean {
|
||||
if (passive && !this.hasPassive()) {
|
||||
return false;
|
||||
}
|
||||
@ -990,7 +990,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return (this.hp || ability.isBypassFaint) && !ability.conditions.find(condition => !condition(this));
|
||||
return (this.hp || ability.isBypassFaint || forceBypass) && !ability.conditions.find(condition => !condition(this));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -145,7 +145,7 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
|
||||
"FULL_HEAL": { name: "Total Soin" },
|
||||
|
||||
"SACRED_ASH": { name: "Cendres Sacrées" },
|
||||
"SACRED_ASH": { name: "Cendre Sacrée" },
|
||||
|
||||
"REVIVER_SEED": { name: "Résugraine", description: "Réanime et restaure la moitié des PV de son porteur s’il tombe K.O." },
|
||||
|
||||
@ -193,10 +193,10 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
"GRIP_CLAW": { name: "Accro Griffe" },
|
||||
"WIDE_LENS": { name: "Loupe" },
|
||||
|
||||
"MULTI_LENS": { name: "Multi Loupe" },
|
||||
"MULTI_LENS": { name: "Lentille Multi" },
|
||||
|
||||
"HEALING_CHARM": { name: "Charme Soin", description: "Augmente de 10% l’efficacité des capacités et objets de soin de PV (hors Rappels)" },
|
||||
"CANDY_JAR": { name: "Jarre de Bonbons", description: "Augmente de 1 le nombre de niveaux gagnés à l’utilisation d’un Super Bonbon" },
|
||||
"CANDY_JAR": { name: "Bonbonnière", description: "Augmente de 1 le nombre de niveaux gagnés à l’utilisation d’un Super Bonbon" },
|
||||
|
||||
"BERRY_POUCH": { name: "Sac à Baies", description: "Ajoute 33% de chances qu’une Baie utilisée ne soit pas consommée" },
|
||||
|
||||
|
@ -2,4 +2,5 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"blockRecoilDamage" : "{{abilityName}} de {{pokemonName}}\nprotegeu-o do dano de recuo!",
|
||||
"badDreams": "{{pokemonName}} está tendo pesadelos!",
|
||||
} as const;
|
||||
|
@ -1,10 +1,10 @@
|
||||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const battleMessageUiHandler: SimpleTranslationEntries = {
|
||||
"ivBest": "Melhor",
|
||||
"ivBest": "Perfeito",
|
||||
"ivFantastic": "Fantástico",
|
||||
"ivVeryGood": "Muito Bom",
|
||||
"ivPrettyGood": "Bom",
|
||||
"ivDecent": "Regular",
|
||||
"ivNoGood": "Ruim",
|
||||
} as const;
|
||||
} as const;
|
||||
|
@ -149,7 +149,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Thrash",
|
||||
effect: "O usuário fica furioso e ataca com violência de dois a três turnos. O usuário então se torna confuso."
|
||||
},
|
||||
"double-Edge": {
|
||||
"doubleEdge": {
|
||||
name: "Double-Edge",
|
||||
effect: "Uma investida imprudente e muito perigosa. Isso também fere bastante o usuário."
|
||||
},
|
||||
@ -477,7 +477,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Mirror Move",
|
||||
effect: "O usuário contra-ataca o alvo imitando seu último movimento utilizado."
|
||||
},
|
||||
"self-Destruct": {
|
||||
"selfDestruct": {
|
||||
name: "Self-Destruct",
|
||||
effect: "O usuário ataca tudo ao seu redor causando uma explosão. O usuário desmaia por usar esse golpe."
|
||||
},
|
||||
@ -537,7 +537,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Kinesis",
|
||||
effect: "O usuário distrai o alvo entortando uma colher. Isso diminui a Precisão do alvo."
|
||||
},
|
||||
"soft-Boiled": {
|
||||
"softBoiled": {
|
||||
name: "Soft-Boiled",
|
||||
effect: "O usuário restaura os próprios PS pela metade dos seus PS máximos."
|
||||
},
|
||||
@ -753,7 +753,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Sludge Bomb",
|
||||
effect: "Lodo insalubre é no arremessado no alvo. Isso também pode causar envenenamento."
|
||||
},
|
||||
"mud-Slap": {
|
||||
"mudSlap": {
|
||||
name: "Mud-Slap",
|
||||
effect: "O usuário arremessa lama no rosto do adversário para causar dano e prejudicar sua precisão."
|
||||
},
|
||||
@ -793,7 +793,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Bone Rush",
|
||||
effect: "O usuário atinge o alvo com um osso duro de duas a cinco vezes seguidas."
|
||||
},
|
||||
"lock-On": {
|
||||
"lockOn": {
|
||||
name: "Lock-On",
|
||||
effect: "O usuário foca sua mira no alvo. Isso garante que o próximo ataque não erre o alvo."
|
||||
},
|
||||
@ -1041,7 +1041,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Flatter",
|
||||
effect: "Bajulação é usada para confundir o oponente. Entretanto, isso também fortalece o Ataque Especial do alvo."
|
||||
},
|
||||
"will-O-Wisp": {
|
||||
"willOWisp": {
|
||||
name: "Will-O-Wisp",
|
||||
effect: "O usuário atira uma sinistra chama azulada no alvo para causar uma queimadura."
|
||||
},
|
||||
@ -1429,7 +1429,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Miracle Eye",
|
||||
effect: "Permite que um alvo tipo Sombrio seja atingido por ataques do tipo Psíquico. Isso também permite que um alvo evasivo possa ser atingido."
|
||||
},
|
||||
"wake-UpSlap": {
|
||||
"wakeUpSlap": {
|
||||
name: "Wake-Up Slap",
|
||||
effect: "Esse ataque causa muito dano em um alvo que estiver dormindo; entretanto, isso também acorda o alvo."
|
||||
},
|
||||
@ -1473,7 +1473,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Metal Burst",
|
||||
effect: "O usuário revida com muito mais força contra o alvo que lhe infligiu dano por ultimo."
|
||||
},
|
||||
"u-Turn": {
|
||||
"uTurn": {
|
||||
name: "U-turn",
|
||||
effect: "Depois de fazer o seu ataque, o usuário corre de volta para trocar de lugar com um Pokémon da própria equipe."
|
||||
},
|
||||
@ -1613,7 +1613,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Air Slash",
|
||||
effect: "O usuário ataca com uma lâmina de ar que corta até mesmo o céu. Isso pode fazer o alvo hesitar."
|
||||
},
|
||||
"x-Scissor": {
|
||||
"xScissor": {
|
||||
name: "X-Scissor",
|
||||
effect: "O usuário cutila o alvo cruzando suas foices ou garras como se elas fossem um par de tesouras."
|
||||
},
|
||||
@ -2225,7 +2225,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Icicle Crash",
|
||||
effect: "O usuário ataca arremessando estacas de gelo no alvo violentamente. Isso também pode fazer o alvo hesitar."
|
||||
},
|
||||
"v-Create": {
|
||||
"vCreate": {
|
||||
name: "V-create",
|
||||
effect: "Com uma ardente chama em sua testa, o usuário joga seu corpo em direção ao alvo. Isso diminui a Defesa, Defesa Especial, e Velocidade do usuário."
|
||||
},
|
||||
@ -2265,7 +2265,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Phantom Force",
|
||||
effect: "O usuário desaparece para algum lugar e então ataca o alvo no próximo turno. Esse movimento acerta mesmo se o alvo estiver se protegendo."
|
||||
},
|
||||
"trick-Or-Treat": {
|
||||
"trickOrTreat": {
|
||||
name: "Trick-or-Treat",
|
||||
effect: "O usuário enche o alvo com o espírito do Halloween para celebrarem juntos. Isso adiciona o tipo Fantasma à tipagem do alvo."
|
||||
},
|
||||
@ -2289,7 +2289,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Petal Blizzard",
|
||||
effect: "O usuário rotaciona uma violenta nevasca composta por pétalas e ataca tudo ao seu redor."
|
||||
},
|
||||
"freeze-Dry": {
|
||||
"freezeDry": {
|
||||
name: "Freeze-Dry",
|
||||
effect: "O usuário rapidamente diminui a temperatura do alvo. Isso pode deixar o alvo congelado. Esse movimento é supereficaz contra tipos Água."
|
||||
},
|
||||
@ -2301,7 +2301,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Parting Shot",
|
||||
effect: "O usuário diminui os atributos de Ataque e Ataque Esp. do alvo com uma ameaça antes de ser trocado por outro Pokémon na equipe."
|
||||
},
|
||||
"topsy-Turvy": {
|
||||
"topsyTurvy": {
|
||||
name: "Topsy-Turvy",
|
||||
effect: "Todas as mudanças de atributos afetando o alvo viram de cabeça para baixo e se tornam o oposto do que eram."
|
||||
},
|
||||
@ -2429,7 +2429,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Hold Hands",
|
||||
effect: "O usuário e um aliado dão as mãos. Isso os deixam muito contentes."
|
||||
},
|
||||
"baby-DollEyes": {
|
||||
"babyDollEyes": {
|
||||
name: "Baby-Doll Eyes",
|
||||
effect: "O usuário encara o alvo com seus olhos adoráveis, o que diminui seu atributo de Ataque. Esse movimento tem prioridade."
|
||||
},
|
||||
@ -2445,7 +2445,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Infestation",
|
||||
effect: "O alvo é infestado e atacado de quatro a cinco turnos. O alvo não pode fugir durante esse período."
|
||||
},
|
||||
"power-UpPunch": {
|
||||
"powerUpPunch": {
|
||||
name: "Power-Up Punch",
|
||||
effect: "Golpear oponentes repetidamente faz os punhos do usuário enrijecerem. Acertar um alvo aumenta o Ataque."
|
||||
},
|
||||
@ -2541,11 +2541,11 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Savage Spin-Out",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"never-EndingNightmarePhysical": {
|
||||
"neverEndingNightmarePhysical": {
|
||||
name: "Never-Ending Nightmare",
|
||||
effect: "Utilizando o Poder Z, o usuário invoca espectros rancorosos que sufocam o alvo. Seu poder varia dependendo do movimento original."
|
||||
},
|
||||
"never-EndingNightmareSpecial": {
|
||||
"neverEndingNightmareSpecial": {
|
||||
name: "Never-Ending Nightmare",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
@ -2793,7 +2793,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Guardian of Alola",
|
||||
effect: "Utilizando o Poder Z, o Espírito Nativo canaliza a energia de Alola e ataca o alvo com força total. Reduz muito os PS do alvo."
|
||||
},
|
||||
"soul-Stealing7-StarStrike": {
|
||||
"soulStealing7StarStrike": {
|
||||
name: "Soul-Stealing 7-Star Strike",
|
||||
effect: "Quando um Marshadow obtém o Poder Z, ele ataca o alvo consecutivamente com socos e chutes usando força total."
|
||||
},
|
||||
@ -2865,11 +2865,11 @@ export const move: MoveTranslationEntries = {
|
||||
name: "Zing Zap",
|
||||
effect: "Uma forte explosão elétrica que cai sobre o alvo, eletrocutando-o e podendo fazê-lo hesitar."
|
||||
},
|
||||
"nature’SMadness": {
|
||||
name: "Nature’s Madness",
|
||||
"naturesMadness": {
|
||||
name: "Nature's Madness",
|
||||
effect: "O usuário atinge o alvo com a força da natureza. Reduz os PS do alvo pela metade."
|
||||
},
|
||||
"multi-Attack": {
|
||||
"multiAttack": {
|
||||
name: "Multi-Attack",
|
||||
effect: "Se envolvendo em energia concentrada, o usuário acerta o alvo. A memória segurada determina o tipo do movimento."
|
||||
},
|
||||
@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
|
||||
},
|
||||
zippyZap: {
|
||||
name: "Zippy Zap",
|
||||
effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness."
|
||||
effect: "O usuário ataca o alvo com rajadas de eletricidade em alta velocidade. Esse movimento sempre vai primeiro e aumenta a Evasão do usuário."
|
||||
},
|
||||
splishySplash: {
|
||||
name: "Splishy Splash",
|
||||
@ -3479,7 +3479,7 @@ export const move: MoveTranslationEntries = {
|
||||
},
|
||||
"gMaxTartness": {
|
||||
name: "G-Max Tartness",
|
||||
effect: "Um ataque do tipo Planta que Gigantamax Flapple usa. Este movimento reduz a evasão dos oponentes."
|
||||
effect: "Um ataque do tipo Planta que Gigantamax Flapple usa. Este movimento reduz a Evasão dos oponentes."
|
||||
},
|
||||
"gMaxSweetness": {
|
||||
name: "G-Max Sweetness",
|
||||
|
@ -4,7 +4,7 @@ export const nature: SimpleTranslationEntries = {
|
||||
"Hardy": "Destemida",
|
||||
"Lonely": "Solitária",
|
||||
"Brave": "Valente",
|
||||
"Adamant": "Rígida",
|
||||
"Adamant": "Adamante",
|
||||
"Naughty": "Teimosa",
|
||||
"Bold": "Corajosa",
|
||||
"Docile": "Dócil",
|
||||
@ -20,7 +20,7 @@ export const nature: SimpleTranslationEntries = {
|
||||
"Mild": "Mansa",
|
||||
"Quiet": "Quieta",
|
||||
"Bashful": "Atrapalhada",
|
||||
"Rash": "Rabugenta",
|
||||
"Rash": "Ousada",
|
||||
"Calm": "Calma",
|
||||
"Gentle": "Gentil",
|
||||
"Sassy": "Atrevida",
|
||||
|
@ -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": "Movimentos",
|
||||
"gender": "Gênero:",
|
||||
"ability": "Habilidade:",
|
||||
"nature": "Natureza:",
|
||||
"epic": "Épico",
|
||||
"rare": "Raro",
|
||||
"common": "Comum",
|
||||
} as const;
|
||||
|
@ -7,15 +7,15 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
*/
|
||||
export const starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam": "Começar com esses Pokémon?",
|
||||
"gen1": "I",
|
||||
"gen2": "II",
|
||||
"gen3": "III",
|
||||
"gen4": "IV",
|
||||
"gen5": "V",
|
||||
"gen6": "VI",
|
||||
"gen7": "VII",
|
||||
"gen8": "VIII",
|
||||
"gen9": "IX",
|
||||
"gen1": "G1",
|
||||
"gen2": "G2",
|
||||
"gen3": "G3",
|
||||
"gen4": "G4",
|
||||
"gen5": "G5",
|
||||
"gen6": "G6",
|
||||
"gen7": "G7",
|
||||
"gen8": "G8",
|
||||
"gen9": "G9",
|
||||
"growthRate": "Crescimento:",
|
||||
"ability": "Habilidade:",
|
||||
"passive": "Passiva:",
|
||||
@ -30,12 +30,12 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"selectMoveSwapWith": "Escolha o movimento que substituirá",
|
||||
"unlockPassive": "Aprender Passiva",
|
||||
"reduceCost": "Reduzir Custo",
|
||||
"cycleShiny": "R: Mudar Shiny",
|
||||
"cycleForm": "F: Mudar Forma",
|
||||
"cycleGender": "G: Mudar Gênero",
|
||||
"cycleAbility": "E: Mudar Habilidade",
|
||||
"cycleNature": "N: Mudar Natureza",
|
||||
"cycleVariant": "V: Mudar Variante",
|
||||
"cycleShiny": "R: » Shiny",
|
||||
"cycleForm": "F: » Forma",
|
||||
"cycleGender": "G: » Gênero",
|
||||
"cycleAbility": "E: » Habilidade",
|
||||
"cycleNature": "N: » Natureza",
|
||||
"cycleVariant": "V: » Variante",
|
||||
"enablePassive": "Ativar Passiva",
|
||||
"disablePassive": "Desativar Passiva",
|
||||
"locked": "Bloqueada",
|
||||
|
@ -1,44 +1,44 @@
|
||||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const gameStatsUiHandler: SimpleTranslationEntries = {
|
||||
"stats": "Stats",
|
||||
"playTime": "Play Time",
|
||||
"totalBattles": "Total Battles",
|
||||
"starters": "Starters",
|
||||
"shinyStarters": "Shiny Starters",
|
||||
"speciesSeen": "Species Seen",
|
||||
"speciesCaught": "Species Caught",
|
||||
"ribbonsOwned": "Ribbons Owned",
|
||||
"classicRuns": "Classic Runs",
|
||||
"classicWins": "Classic Wins",
|
||||
"dailyRunAttempts": "Daily Run Attempts",
|
||||
"dailyRunWins": "Daily Run Wins",
|
||||
"endlessRuns": "Endless Runs",
|
||||
"highestWaveEndless": "Highest Wave (Endless)",
|
||||
"highestMoney": "Highest Money",
|
||||
"highestDamage": "Highest Damage",
|
||||
"highestHPHealed": "Highest HP Healed",
|
||||
"pokemonEncountered": "Pokémon Encountered",
|
||||
"pokemonDefeated": "Pokémon Defeated",
|
||||
"pokemonCaught": "Pokémon Caught",
|
||||
"eggsHatched": "Eggs Hatched",
|
||||
"subLegendsSeen": "Sub-Legends Seen",
|
||||
"subLegendsCaught": "Sub-Legends Caught",
|
||||
"subLegendsHatched": "Sub-Legends Hatched",
|
||||
"legendsSeen": "Legends Seen",
|
||||
"legendsCaught": "Legends Caught",
|
||||
"legendsHatched": "Legends Hatched",
|
||||
"mythicalsSeen": "Mythicals Seen",
|
||||
"mythicalsCaught": "Mythicals Caught",
|
||||
"mythicalsHatched": "Mythicals Hatched",
|
||||
"shiniesSeen": "Shinies Seen",
|
||||
"shiniesCaught": "Shinies Caught",
|
||||
"shiniesHatched": "Shinies Hatched",
|
||||
"pokemonFused": "Pokémon Fused",
|
||||
"trainersDefeated": "Trainers Defeated",
|
||||
"eggsPulled": "Eggs Pulled",
|
||||
"rareEggsPulled": "Rare Eggs Pulled",
|
||||
"epicEggsPulled": "Epic Eggs Pulled",
|
||||
"legendaryEggsPulled": "Legendary Eggs Pulled",
|
||||
"manaphyEggsPulled": "Manaphy Eggs Pulled",
|
||||
"stats": "统计",
|
||||
"playTime": "游戏时间",
|
||||
"totalBattles": "总战斗次数",
|
||||
"starters": "初始宝可梦",
|
||||
"shinyStarters": "闪光初始宝可梦",
|
||||
"speciesSeen": "遇到的种类",
|
||||
"speciesCaught": "捕捉的种类",
|
||||
"ribbonsOwned": "拥有缎带数",
|
||||
"classicRuns": "经典模式次数",
|
||||
"classicWins": "经典模式通关次数",
|
||||
"dailyRunAttempts": "每日挑战次数",
|
||||
"dailyRunWins": "每日挑战通关次数",
|
||||
"endlessRuns": "无尽模式挑战次数",
|
||||
"highestWaveEndless": "最高层数(无尽)",
|
||||
"highestMoney": "最多金钱",
|
||||
"highestDamage": "最高伤害",
|
||||
"highestHPHealed": "最多治疗",
|
||||
"pokemonEncountered": "遇敌数量",
|
||||
"pokemonDefeated": "打倒数量",
|
||||
"pokemonCaught": "捕捉数量",
|
||||
"eggsHatched": "孵蛋数量",
|
||||
"subLegendsSeen": "遇到的二级神宝可梦",
|
||||
"subLegendsCaught": "捕捉的二级神宝可梦",
|
||||
"subLegendsHatched": "孵化的二级神宝可梦",
|
||||
"legendsSeen": "遇到的传说宝可梦",
|
||||
"legendsCaught": "捕捉的传说宝可梦",
|
||||
"legendsHatched": "孵化的传说宝可梦",
|
||||
"mythicalsSeen": "遇到的幻兽宝可梦",
|
||||
"mythicalsCaught": "捕捉的幻兽宝可梦",
|
||||
"mythicalsHatched": "孵化的幻兽宝可梦",
|
||||
"shiniesSeen": "遇到的闪光宝可梦",
|
||||
"shiniesCaught": "捕捉的闪光宝可梦",
|
||||
"shiniesHatched": "孵化的闪光宝可梦",
|
||||
"pokemonFused": "融合宝可梦次数",
|
||||
"trainersDefeated": "打败的训练师数",
|
||||
"eggsPulled": "总扭蛋次数",
|
||||
"rareEggsPulled": "稀有扭蛋数",
|
||||
"epicEggsPulled": "史诗扭蛋数",
|
||||
"legendaryEggsPulled": "传说扭蛋数",
|
||||
"manaphyEggsPulled": "玛娜霏扭蛋数",
|
||||
} as const;
|
||||
|
@ -30,7 +30,7 @@ import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, get
|
||||
import { TempBattleStat } from "./data/temp-battle-stat";
|
||||
import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag";
|
||||
import { ArenaTagType } from "./data/enums/arena-tag-type";
|
||||
import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, IgnoreOpponentEvasionAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, applyPostBattleInitAbAttrs, PostBattleInitAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr } from "./data/ability";
|
||||
import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, IgnoreOpponentEvasionAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr } from "./data/ability";
|
||||
import { Unlockables, getUnlockableName } from "./system/unlockables";
|
||||
import { getBiomeKey } from "./field/arena";
|
||||
import { BattleType, BattlerIndex, TurnCommand } from "./battle";
|
||||
@ -987,18 +987,14 @@ export class EncounterPhase extends BattlePhase {
|
||||
if (!this.loaded) {
|
||||
const availablePartyMembers = this.scene.getParty().filter(p => !p.isFainted());
|
||||
|
||||
if (availablePartyMembers[0].isOnField()) {
|
||||
applyPostBattleInitAbAttrs(PostBattleInitAbAttr, availablePartyMembers[0]);
|
||||
} else {
|
||||
if (!availablePartyMembers[0].isOnField()) {
|
||||
this.scene.pushPhase(new SummonPhase(this.scene, 0));
|
||||
}
|
||||
|
||||
if (this.scene.currentBattle.double) {
|
||||
if (availablePartyMembers.length > 1) {
|
||||
this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, true));
|
||||
if (availablePartyMembers[1].isOnField()) {
|
||||
applyPostBattleInitAbAttrs(PostBattleInitAbAttr, availablePartyMembers[1]);
|
||||
} else {
|
||||
if (!availablePartyMembers[1].isOnField()) {
|
||||
this.scene.pushPhase(new SummonPhase(this.scene, 1));
|
||||
}
|
||||
}
|
||||
@ -1475,8 +1471,6 @@ export class SwitchSummonPhase extends SummonPhase {
|
||||
(this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.removeTagsBySourceId(pokemon.id));
|
||||
}
|
||||
|
||||
applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, pokemon);
|
||||
|
||||
this.scene.ui.showText(this.player ?
|
||||
i18next.t("battle:playerComeBack", { pokemonName: pokemon.name }) :
|
||||
i18next.t("battle:trainerComeBack", {
|
||||
@ -1505,6 +1499,7 @@ export class SwitchSummonPhase extends SummonPhase {
|
||||
const party = this.player ? this.getParty() : this.scene.getEnemyParty();
|
||||
const switchedPokemon = party[this.slotIndex];
|
||||
this.lastPokemon = this.getPokemon();
|
||||
applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, this.lastPokemon);
|
||||
if (this.batonPass && switchedPokemon) {
|
||||
(this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.transferTagsBySourceId(this.lastPokemon.id, switchedPokemon.id));
|
||||
if (!this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedPokemon.id)) {
|
||||
|
@ -47,11 +47,11 @@ export class SceneBase extends Phaser.Scene {
|
||||
if (folder) {
|
||||
folder += "/";
|
||||
}
|
||||
this.load.atlas(key, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}/${filenameRoot}.json`));
|
||||
this.load.atlas(key, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}${filenameRoot}.json`));
|
||||
if (folder.startsWith("ui")) {
|
||||
legacyCompatibleImages.push(key);
|
||||
folder = folder.replace("ui", "ui/legacy");
|
||||
this.load.atlas(`${key}_legacy`, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}/${filenameRoot}.json`));
|
||||
this.load.atlas(`${key}_legacy`, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}${filenameRoot}.json`));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,16 +1,48 @@
|
||||
import { getVariantTint } from "#app/data/variant";
|
||||
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
|
||||
import BattleScene from "../battle-scene";
|
||||
import { Gender, getGenderColor, getGenderSymbol } from "../data/gender";
|
||||
import { getNatureName } from "../data/nature";
|
||||
import { Type } from "../data/type";
|
||||
import Pokemon from "../field/pokemon";
|
||||
import i18next from "../plugins/i18n";
|
||||
import * as Utils from "../utils";
|
||||
import ConfirmUiHandler from "./confirm-ui-handler";
|
||||
import { StatsContainer } from "./stats-container";
|
||||
import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text";
|
||||
import { addWindow } from "./ui-theme";
|
||||
import { getNatureName } from "../data/nature";
|
||||
import * as Utils from "../utils";
|
||||
import { Type } from "../data/type";
|
||||
import { getVariantTint } from "#app/data/variant";
|
||||
import ConfirmUiHandler from "./confirm-ui-handler";
|
||||
import i18next from "../plugins/i18n";
|
||||
|
||||
interface LanguageSetting {
|
||||
infoContainerTextSize: string;
|
||||
infoContainerLabelXPos?: integer;
|
||||
infoContainerTextXPos?: integer;
|
||||
}
|
||||
|
||||
const languageSettings: { [key: string]: LanguageSetting } = {
|
||||
"en": {
|
||||
infoContainerTextSize: "64px"
|
||||
},
|
||||
"de": {
|
||||
infoContainerTextSize: "64px"
|
||||
},
|
||||
"es": {
|
||||
infoContainerTextSize: "64px"
|
||||
},
|
||||
"fr": {
|
||||
infoContainerTextSize: "64px"
|
||||
},
|
||||
"it": {
|
||||
infoContainerTextSize: "64px"
|
||||
},
|
||||
"zh": {
|
||||
infoContainerTextSize: "64px"
|
||||
},
|
||||
"pt": {
|
||||
infoContainerTextSize: "60px",
|
||||
infoContainerLabelXPos: -16,
|
||||
infoContainerTextXPos: -12,
|
||||
},
|
||||
};
|
||||
|
||||
export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
|
||||
private readonly infoWindowWidth = 104;
|
||||
@ -41,6 +73,9 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
|
||||
}
|
||||
|
||||
setup(): void {
|
||||
const currentLanguage = i18next.language;
|
||||
const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang));
|
||||
const textSettings = languageSettings[langSettingKey];
|
||||
const infoBg = addWindow(this.scene, 0, 0, this.infoWindowWidth, 132);
|
||||
infoBg.setOrigin(0.5, 0.5);
|
||||
|
||||
@ -87,29 +122,36 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
|
||||
this.add(infoBg);
|
||||
this.add(this.statsContainer);
|
||||
|
||||
this.pokemonGenderLabelText = addTextObject(this.scene, -18, 18, i18next.t("pokemonInfoContainer:gender"), TextStyle.WINDOW, { fontSize: "64px" });
|
||||
// The position should be set per language
|
||||
const infoContainerLabelXPos = textSettings?.infoContainerLabelXPos || -18;
|
||||
const infoContainerTextXPos = textSettings?.infoContainerTextXPos || -14;
|
||||
|
||||
// The font size should be set by language
|
||||
const infoContainerTextSize = textSettings?.infoContainerTextSize || "64px";
|
||||
|
||||
this.pokemonGenderLabelText = addTextObject(this.scene, infoContainerLabelXPos, 18, i18next.t("pokemonInfoContainer:gender"), TextStyle.WINDOW, { fontSize: infoContainerTextSize });
|
||||
this.pokemonGenderLabelText.setOrigin(1, 0);
|
||||
this.pokemonGenderLabelText.setVisible(false);
|
||||
this.add(this.pokemonGenderLabelText);
|
||||
|
||||
this.pokemonGenderText = addTextObject(this.scene, -14, 18, "", TextStyle.WINDOW, { fontSize: "64px" });
|
||||
this.pokemonGenderText = addTextObject(this.scene, infoContainerTextXPos, 18, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize });
|
||||
this.pokemonGenderText.setOrigin(0, 0);
|
||||
this.pokemonGenderText.setVisible(false);
|
||||
this.add(this.pokemonGenderText);
|
||||
|
||||
this.pokemonAbilityLabelText = addTextObject(this.scene, -18, 28, i18next.t("pokemonInfoContainer:ability"), TextStyle.WINDOW, { fontSize: "64px" });
|
||||
this.pokemonAbilityLabelText = addTextObject(this.scene, infoContainerLabelXPos, 28, i18next.t("pokemonInfoContainer:ability"), TextStyle.WINDOW, { fontSize: infoContainerTextSize });
|
||||
this.pokemonAbilityLabelText.setOrigin(1, 0);
|
||||
this.add(this.pokemonAbilityLabelText);
|
||||
|
||||
this.pokemonAbilityText = addTextObject(this.scene, -14, 28, "", TextStyle.WINDOW, { fontSize: "64px" });
|
||||
this.pokemonAbilityText = addTextObject(this.scene, infoContainerTextXPos, 28, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize });
|
||||
this.pokemonAbilityText.setOrigin(0, 0);
|
||||
this.add(this.pokemonAbilityText);
|
||||
|
||||
this.pokemonNatureLabelText = addTextObject(this.scene, -18, 38, i18next.t("pokemonInfoContainer:nature"), TextStyle.WINDOW, { fontSize: "64px" });
|
||||
this.pokemonNatureLabelText = addTextObject(this.scene, infoContainerLabelXPos, 38, i18next.t("pokemonInfoContainer:nature"), TextStyle.WINDOW, { fontSize: infoContainerTextSize });
|
||||
this.pokemonNatureLabelText.setOrigin(1, 0);
|
||||
this.add(this.pokemonNatureLabelText);
|
||||
|
||||
this.pokemonNatureText = addBBCodeTextObject(this.scene, -14, 38, "", TextStyle.WINDOW, { fontSize: "64px", lineSpacing: 3, maxLines: 2 });
|
||||
this.pokemonNatureText = addBBCodeTextObject(this.scene, infoContainerTextXPos, 38, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize, lineSpacing: 3, maxLines: 2 });
|
||||
this.pokemonNatureText.setOrigin(0, 0);
|
||||
this.add(this.pokemonNatureText);
|
||||
|
||||
|
@ -76,9 +76,9 @@ const languageSettings: { [key: string]: LanguageSetting } = {
|
||||
starterInfoYOffset: 2
|
||||
},
|
||||
"pt":{
|
||||
starterInfoTextSize: "47px",
|
||||
instructionTextSize: "38px",
|
||||
starterInfoXPos: 32,
|
||||
starterInfoTextSize: "48px",
|
||||
instructionTextSize: "42px",
|
||||
starterInfoXPos: 33,
|
||||
},
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user