Merge branch 'beta' into mine

This commit is contained in:
Lylian 2024-08-11 23:31:33 +02:00
commit ae05d154b4
165 changed files with 2872 additions and 2323 deletions

View File

@ -2,10 +2,10 @@
<!-- Make sure that this PR is not overlapping with someone else's work --> <!-- Make sure that this PR is not overlapping with someone else's work -->
<!-- Please try to keep the PR self-contained (and small) --> <!-- Please try to keep the PR self-contained (and small) -->
## What are the changes? ## What are the changes the user will see?
<!-- Summarize what are the changes from a user perspective on the application --> <!-- Summarize what are the changes from a user perspective on the application -->
## Why am I doing these changes the user will see? ## Why am I making these changes?
<!-- Explain why you decided to introduce these changes --> <!-- Explain why you decided to introduce these changes -->
<!-- Does it come from an issue or another PR? Please link it --> <!-- Does it come from an issue or another PR? Please link it -->
<!-- Explain why you believe this can enhance user experience --> <!-- Explain why you believe this can enhance user experience -->

301
index.css
View File

@ -1,16 +1,8 @@
/* Global */
:root { :root {
--color-base: hsl(0, 0%, 55%); --color-base: hsl(0, 0%, 55%);
--color-light: hsl(0, 0%, 90%); --color-light: hsl(0, 0%, 90%);
--color-dark: hsl(0, 0%, 10%); --color-dark: hsl(0, 0%, 10%);
--controls-size: 10vh;
--text-shadow-size: 0.65vh;
}
@media (orientation: landscape) {
:root {
--controls-size: 20vh;
--text-shadow-size: 1.3vh;
}
} }
html { html {
@ -43,33 +35,173 @@ body {
transform-origin: top !important; transform-origin: top !important;
} }
#layout:fullscreen #dpad, #layout:fullscreen {
bottom: 6rem;
}
input:-internal-autofill-selected {
-webkit-background-clip: text;
background-clip: text;
}
/* Need adjust input font-size */ /* Need adjust input font-size */
input { input {
font-size: 3.2rem; font-size: 3.2rem;
} }
.hidden {
display: none !important;
}
input:-internal-autofill-selected {
-webkit-background-clip: text;
background-clip: text;
}
/* Touch Controls: */
#touchControls {
--text-shadow-size: 0.65vh;
--controls-size: 10vh;
--touch-control-opacity: 0.6;
--controls-padding: 1rem;
--controls-size-with-padding: calc(var(--controls-size) + var(--controls-padding));
--control-group-extra-size: calc(var(--controls-size) * 0.8);
--control-group-extra-2-offset: calc(var(--controls-size-with-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2);
--control-group-extra-1-offset: calc(var(--controls-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2);
--small-control-size: calc(var(--controls-size) / 3);
--rect-control-size: calc(var(--controls-size) * 0.74);
font-family: 'emerald';
font-size: var(--controls-size);
text-shadow: var(--color-dark) var(--text-shadow-size) var(--text-shadow-size);
color: var(--color-light);
}
@media (orientation: landscape) {
#touchControls {
--controls-size: 20vh;
--text-shadow-size: 1.3vh;
--small-button-offset: 4vh;
}
}
#touchControls:not(.visible) { #touchControls:not(.visible) {
display: none; display: none;
} }
#dpad, #apad { #touchControls .active {
opacity: var(--touch-control-opacity);
}
.control-group {
position: fixed; position: fixed;
bottom: 1rem; display: flex;
flex-wrap: wrap;
justify-content: space-around;
align-items: center;
width: var(--controls-size);
}
.control-group-dpad {
width: calc(2 * var(--controls-size));
height: calc(2 * var(--controls-size));
}
.control-group-extra {
width: var(--control-group-extra-size);
height: var(--control-group-extra-size);
}
/* Hide buttons on specific UIs */
/* Show #cycleForm and #cycleShiny only on STARTER_SELECT and SETTINGS */
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode^='SETTINGS']) #apadCycleForm,
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode^='SETTINGS']) #apadCycleShiny {
display: none;
}
/* Show #apadInfo only in battle */
#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']) #apadInfo {
display: none;
}
/* Show #apadInfo only in battle and target select */
#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']):not([data-ui-mode='MODIFIER_SELECT']) #apadStats {
display: none;
}
/* Show cycle buttons only on STARTER_SELECT and on touch configuration panel */
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleAbility,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleGender,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleVariant {
display: none;
}
/* Configuration toolbar */
#configToolbar {
width: 100%;
position: fixed;
top: 1rem;
left: 0;
z-index: 9;
user-select: none;
}
#configToolbar .column {
display: flex;
flex-direction: column;
align-items: center;
gap: 10%;
padding: 0 var(--controls-padding);
}
#configToolbar .button-row {
display: flex;
justify-content: space-evenly;
width: 100%;
}
#configToolbar .info-row {
display: flex;
justify-content: flex-start;
width: 100%;
}
#configToolbar .button {
z-index: 3; z-index: 3;
background-color: var(--color-base);
display: flex;
justify-content: center;
align-items: center;
text-align: center;
border-radius: 10%;
height: var(--small-control-size);
font-size: var(--small-control-size);
border-radius: 8px;
padding: 2px 8px;
text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3);
} }
@media (orientation: portrait) { #configToolbar .button:active {
#dpad, #apad { opacity: var(--touch-control-opacity)
bottom: calc(1rem + env(safe-area-inset-bottom));
}
} }
#configToolbar .orientation-label {
font-size: var(--small-control-size);
text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3);
}
/* dpad */
#dpad { #dpad {
left: 1rem; z-index: 3;
} opacity: 0.8;
#apad {
right: 1rem;
} }
#dpad svg { #dpad svg {
@ -78,114 +210,83 @@ input {
fill: var(--color-base); fill: var(--color-base);
} }
#dpad svg rect { /* apad buttons */
opacity: 0.6;
}
#apad > * { .apad-button {
width: var(--controls-size);
height: var(--controls-size);
}
#apad .apadBtn {
width: var(--controls-size);
height: var(--controls-size);
background-color: var(--color-base); background-color: var(--color-base);
border-radius: 50%; border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
right: 0;
bottom: 0;
width: var(--controls-size);
height: var(--controls-size);
opacity: 0.8;
border-radius: 8px;
} }
#apad .apadLabel { .apad-small {
font-family: 'emerald'; width: var(--small-control-size);
font-size: var(--controls-size); height: var(--small-control-size);
text-shadow: var(--color-dark) var(--text-shadow-size) var(--text-shadow-size); }
color: var(--color-light);
.apad-label {
user-select: none; user-select: none;
height: 100%;
margin-right: -2px;
} }
#apad .apadLabelSmall { .apad-small > .apad-label {
font-size: calc(var(--controls-size) / 3); font-size: var(--small-control-size);
text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3); text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3);
} }
#apad #apadLabelAction, #apad #apadLabelCancel { .apad-rectangle {
margin-left: calc(var(--controls-size) / 3);
line-height: 0.9;
}
#apad > :nth-child(2) {
position: relative;
right: var(--controls-size);
}
#apad .apadRectBtn {
position: relative;
text-align: center; text-align: center;
padding-right: 10%; width: var(--rect-control-size);
border-radius: 10%; height: var(--small-control-size);
bottom: calc(var(--controls-size) * 0.05);
width: calc(var(--controls-size) * 0.6);
height: calc(var(--controls-size) * 0.3);
} }
#apad .apadSqBtn { .apad-square {
border-radius: 10%; width: var(--small-control-size);
width: calc(var(--controls-size) * 0.3); height: var(--small-control-size);
height: calc(var(--controls-size) * 0.3);
} }
#apad .apadBtnContainer { .apad-circle {
position: relative; width: var(--controls-size);
display: flex; height: var(--controls-size);
border-radius: 50%;
} }
#apad .apadRectBtnContainer { /* Defaults:*/
flex-wrap: wrap;
margin-top: calc(var(--controls-size) * -0.8); #control-group-dpad {
left: calc(var(--controls-size) * 0.175); left: var(--controls-padding);
height: calc(var(--controls-size) * 0.8); bottom: var(--controls-padding);
} }
#apad .apadSqBtnContainer { #control-group-action {
flex-wrap: wrap; right: var(--controls-padding);
justify-content: space-evenly; bottom: var(--controls-size-with-padding);
align-items: center;
margin-bottom: calc(var(--controls-size) * -0.8);
top: calc(var(--controls-size) * -0.9);
width: calc(var(--controls-size) * 0.8);
height: calc(var(--controls-size) * 0.8);
} }
#apad .apadRectBtnContainer > #apadMenu { #control-group-cancel {
align-self: flex-end; right: var(--controls-size-with-padding);
bottom: var(--controls-padding);;
} }
#apad .apadRectBtnContainer > .apadSqBtn:not(:first-child) { #control-group-extra-1 {
margin-left: 10%; right: var(--control-group-extra-1-offset);
bottom: var(--control-group-extra-1-offset);
} }
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode='SETTINGS']):not([data-ui-mode='SETTINGS_DISPLAY']):not([data-ui-mode='SETTINGS_AUDIO']):not([data-ui-mode='SETTINGS_GAMEPAD']):not([data-ui-mode='SETTINGS_KEYBOARD']) #apad .apadRectBtnContainer > .apadSqBtn:not(.apadBattle), #control-group-extra-2 {
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode='SETTINGS']):not([data-ui-mode='SETTINGS_DISPLAY']):not([data-ui-mode='SETTINGS_AUDIO']):not([data-ui-mode='SETTINGS_GAMEPAD']):not([data-ui-mode='SETTINGS_KEYBOARD']) #apad .apadSqBtnContainer > .apadSqBtn:not(.apadBattle) right: var(--control-group-extra-2-offset);
{ bottom: var(--control-group-extra-2-offset);
display: none;
} }
#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']):not([data-ui-mode='MODIFIER_SELECT']) #apad .apadBattle { /* Layout */
display: none;
}
#apad .apadRectBtnContainer + .apadSqBtnContainer {
top: calc(var(--controls-size) * -1.9);
left: calc(var(--controls-size) * -0.9);
}
#apad .apadBtnContainer .apadLabel {
margin-left: calc(var(--controls-size) / 12);
line-height: 0.8;
}
#dpad path:not(.active), #apad .apadBtn:not(.active) {
opacity: 0.6;
}
#layout:fullscreen #dpad, #layout:fullscreen #apad { #layout:fullscreen #dpad, #layout:fullscreen #apad {
bottom: 6rem; bottom: 6rem;

View File

@ -64,54 +64,70 @@
<body> <body>
<div id="app"></div> <div id="app"></div>
<div id="touchControls"> <div id="touchControls">
<div id="dpad" class="unselectable"> <div class="left">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 72 72"> <div id="control-group-dpad" class="control-group control-group-dpad">
<path id="dpadUp" data-key="UP" d="M48,5.8C48,2.5,45.4,0,42,0H29.9C26.6,0,24,2.4,24,5.8V24h24V5.8z" /> <div id="dpad" data-control-key="DPAD">
<path id="dpadRight" data-key="RIGHT" d="M66.2,24H48v24h18.2c3.3,0,5.8-2.7,5.8-6V29.9C72,26.5,69.5,24,66.2,24z" /> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 72 72">
<path id="dpadDown" data-key="DOWN" d="M24,66.3c0,3.3,2.6,5.7,5.9,5.7H42c3.3,0,6-2.4,6-5.7V48H24V66.3z" /> <path id="dpadUp" data-key="UP"
<path id="dpadLeft" data-key="LEFT" d="M5.7,24C2.4,24,0,26.5,0,29.9V42c0,3.3,2.3,6,5.7,6H24V24H5.7z" /> d="M48,5.8C48,2.5,45.4,0,42,0H29.9C26.6,0,24,2.4,24,5.8V24h24V5.8z" />
<rect id="dpadCenter" x="24" y="24" width="24" height="24" /> <path id="dpadRight" data-key="RIGHT"
</svg> d="M66.2,24H48v24h18.2c3.3,0,5.8-2.7,5.8-6V29.9C72,26.5,69.5,24,66.2,24z" />
<path id="dpadDown" data-key="DOWN"
d="M24,66.3c0,3.3,2.6,5.7,5.9,5.7H42c3.3,0,6-2.4,6-5.7V48H24V66.3z" />
<path id="dpadLeft" data-key="LEFT"
d="M5.7,24C2.4,24,0,26.5,0,29.9V42c0,3.3,2.3,6,5.7,6H24V24H5.7z" />
<rect id="dpadCenter" x="24" y="24" width="24" height="24" />
</svg>
</div>
</div>
</div> </div>
<div id="apad" class="unselectable"> <div class="right">
<div id="apadAction" class="apadCircBtn apadBtn" data-key="ACTION"> <div id="control-group-action" class="control-group">
<text id="apadLabelAction" class="apadLabel">A</text> <div id="apadAction" class="apad-button apad-circle" data-key="ACTION">
</div> <span class="apad-label">A</span>
<div id="apadCancel" class="apadCircBtn apadBtn" data-key="CANCEL">
<text id="apadLabelCancel" class="apadLabel">B</text>
</div>
<div class="apadBtnContainer apadRectBtnContainer">
<div id="apadCycleShiny" class="apadSqBtn apadBtn" data-key="CYCLE_SHINY">
<text class="apadLabel apadLabelSmall">R</text>
</div>
<div id="apadCycleVariant" class="apadSqBtn apadBtn" data-key="V">
<text class="apadLabel apadLabelSmall">V</text>
</div>
<div id="apadStats" class="apadRectBtn apadBtn apadBattle" data-key="STATS">
<text class="apadLabel apadLabelSmall">C</text>
</div>
<div id="apadMenu" class="apadRectBtn apadBtn" data-key="MENU">
<text class="apadLabel apadLabelSmall">Menu</text>
</div> </div>
</div> </div>
<div class="apadBtnContainer apadSqBtnContainer">
<div id="apadCycleForm" class="apadSqBtn apadBtn" data-key="CYCLE_FORM"> <div id="control-group-cancel" class="control-group">
<text class="apadLabel apadLabelSmall">F</text> <div id="apadCancel" class="apad-button apad-circle" data-key="CANCEL">
</div> <span class="apad-label">B</span>
<div id="apadCycleGender" class="apadSqBtn apadBtn" data-key="CYCLE_GENDER">
<text class="apadLabel apadLabelSmall">G</text>
</div>
<div id="apadCycleAbility" class="apadSqBtn apadBtn" data-key="CYCLE_ABILITY">
<text class="apadLabel apadLabelSmall">E</text>
</div>
<div id="apadCycleNature" class="apadSqBtn apadBtn" data-key="CYCLE_NATURE">
<text class="apadLabel apadLabelSmall">N</text>
</div>
<div id="apadInfo" class="apadRectBtn apadBtn apadBattle" data-key="V">
<text class="apadLabel apadLabelSmall">V</text>
</div> </div>
</div> </div>
<div id="control-group-extra-1" class="control-group control-group-extra">
<div id="apadCycleShiny" class="apad-button apad-square apad-small" data-key="CYCLE_SHINY">
<span class="apad-label">R</span>
</div>
<div id="apadCycleVariant" class="apad-button apad-square apad-small" data-key="V">
<span class="apad-label">V</span>
</div>
<div id="apadStats" class="apad-button apad-rectangle apad-small" data-key="STATS">
<span class="apad-label">C</span>
</div>
<div id="apadMenu" class="apad-button apad-rectangle apad-small" data-key="MENU">
<span class="apad-label">Menu</span>
</div>
</div>
<div id="control-group-extra-2" class="control-group control-group-extra">
<div id="apadCycleForm" class="apad-button apad-square apad-small" data-key="CYCLE_FORM">
<span class="apad-label">F</span>
</div>
<div id="apadCycleGender" class="apad-button apad-square apad-small" data-key="CYCLE_GENDER">
<span class="apad-label">G</span>
</div>
<div id="apadCycleAbility" class="apad-button apad-square apad-small" data-key="CYCLE_ABILITY">
<span class="apad-label">E</span>
</div>
<div id="apadCycleNature" class="apad-button apad-square apad-small" data-key="CYCLE_NATURE">
<span class="apad-label">N</span>
</div>
<div id="apadInfo" class="apad-button apad-rectangle apad-small" data-key="V">
<span class="apad-label">V</span>
</div>
</div>
</div> </div>
</div> </div>
<div id="tnc-links"> <div id="tnc-links">

View File

@ -13,6 +13,7 @@
"test:cov": "vitest run --project pre && vitest run --project main --coverage", "test:cov": "vitest run --project pre && vitest run --project main --coverage",
"test:watch": "vitest run --project pre && vitest watch --project main --coverage", "test:watch": "vitest run --project pre && vitest watch --project main --coverage",
"test:silent": "vitest run --project pre && vitest run --project main --silent", "test:silent": "vitest run --project pre && vitest run --project main --silent",
"typecheck": "tsc --noEmit",
"eslint": "eslint --fix .", "eslint": "eslint --fix .",
"eslint-ci": "eslint .", "eslint-ci": "eslint .",
"docs": "typedoc", "docs": "typedoc",

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

View File

@ -6,7 +6,7 @@ import { BattleStat, getBattleStatName } from "./battle-stat";
import { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases";
import { getPokemonNameWithAffix } from "../messages"; import { getPokemonNameWithAffix } from "../messages";
import { Weather, WeatherType } from "./weather"; import { Weather, WeatherType } from "./weather";
import { BattlerTag, GroundedTag, GulpMissileTag } from "./battler-tags"; import { BattlerTag, GroundedTag, GulpMissileTag, SemiInvulnerableTag } from "./battler-tags";
import { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; import { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect";
import { Gender } from "./gender"; import { Gender } from "./gender";
import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, MoveAttr, MultiHitAttr, ChargeAttr, SacrificialAttr, SacrificialAttrOnHit } from "./move"; import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, MoveAttr, MultiHitAttr, ChargeAttr, SacrificialAttr, SacrificialAttrOnHit } from "./move";
@ -517,7 +517,7 @@ export class PostDefendGulpMissileAbAttr extends PostDefendAbAttr {
*/ */
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean | Promise<boolean> { applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean | Promise<boolean> {
const battlerTag = pokemon.getTag(GulpMissileTag); const battlerTag = pokemon.getTag(GulpMissileTag);
if (!battlerTag || move.category === MoveCategory.STATUS) { if (!battlerTag || move.category === MoveCategory.STATUS || pokemon.getTag(SemiInvulnerableTag)) {
return false; return false;
} }
@ -5138,9 +5138,7 @@ export function initAbilities() {
.attr(NoFusionAbilityAbAttr) .attr(NoFusionAbilityAbAttr)
.attr(UncopiableAbilityAbAttr) .attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr) .attr(UnswappableAbilityAbAttr)
.attr(PostDefendGulpMissileAbAttr) .attr(PostDefendGulpMissileAbAttr),
// Does not transform when Surf/Dive misses/is protected
.partial(),
new Ability(Abilities.STALWART, 8) new Ability(Abilities.STALWART, 8)
.attr(BlockRedirectAbAttr), .attr(BlockRedirectAbAttr),
new Ability(Abilities.STEAM_ENGINE, 8) new Ability(Abilities.STEAM_ENGINE, 8)

View File

@ -1,6 +1,6 @@
//import { battleAnimRawData } from "./battle-anim-raw-data"; //import { battleAnimRawData } from "./battle-anim-raw-data";
import BattleScene from "../battle-scene"; import BattleScene from "../battle-scene";
import { AttackMove, ChargeAttr, DelayedAttackAttr, MoveFlags, SelfStatusMove, allMoves } from "./move"; import { AttackMove, BeakBlastHeaderAttr, ChargeAttr, DelayedAttackAttr, MoveFlags, SelfStatusMove, allMoves } from "./move";
import Pokemon from "../field/pokemon"; import Pokemon from "../field/pokemon";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { BattlerIndex } from "../battle"; import { BattlerIndex } from "../battle";
@ -485,7 +485,8 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise<void> {
const fetchAnimAndResolve = (move: Moves) => { const fetchAnimAndResolve = (move: Moves) => {
scene.cachedFetch(`./battle-anims/${moveName}.json`) scene.cachedFetch(`./battle-anims/${moveName}.json`)
.then(response => { .then(response => {
if (!response.ok) { const contentType = response.headers.get("content-type");
if (!response.ok || contentType?.indexOf("application/json") === -1) {
console.error(`Could not load animation file for move '${moveName}'`, response.status, response.statusText); console.error(`Could not load animation file for move '${moveName}'`, response.status, response.statusText);
populateMoveAnim(move, moveAnims.get(defaultMoveAnim)); populateMoveAnim(move, moveAnims.get(defaultMoveAnim));
return resolve(); return resolve();
@ -499,7 +500,9 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise<void> {
} else { } else {
populateMoveAnim(move, ba); populateMoveAnim(move, ba);
} }
const chargeAttr = allMoves[move].getAttrs(ChargeAttr)[0] || allMoves[move].getAttrs(DelayedAttackAttr)[0]; const chargeAttr = allMoves[move].getAttrs(ChargeAttr)[0]
|| allMoves[move].getAttrs(DelayedAttackAttr)[0]
|| allMoves[move].getAttrs(BeakBlastHeaderAttr)[0];
if (chargeAttr) { if (chargeAttr) {
initMoveChargeAnim(scene, chargeAttr.chargeAnim).then(() => resolve()); initMoveChargeAnim(scene, chargeAttr.chargeAnim).then(() => resolve());
} else { } else {
@ -570,7 +573,9 @@ export function loadMoveAnimAssets(scene: BattleScene, moveIds: Moves[], startLo
return new Promise(resolve => { return new Promise(resolve => {
const moveAnimations = moveIds.map(m => moveAnims.get(m) as AnimConfig).flat(); const moveAnimations = moveIds.map(m => moveAnims.get(m) as AnimConfig).flat();
for (const moveId of moveIds) { for (const moveId of moveIds) {
const chargeAttr = allMoves[moveId].getAttrs(ChargeAttr)[0] || allMoves[moveId].getAttrs(DelayedAttackAttr)[0]; const chargeAttr = allMoves[moveId].getAttrs(ChargeAttr)[0]
|| allMoves[moveId].getAttrs(DelayedAttackAttr)[0]
|| allMoves[moveId].getAttrs(BeakBlastHeaderAttr)[0];
if (chargeAttr) { if (chargeAttr) {
const moveChargeAnims = chargeAnims.get(chargeAttr.chargeAnim); const moveChargeAnims = chargeAnims.get(chargeAttr.chargeAnim);
moveAnimations.push(moveChargeAnims instanceof AnimConfig ? moveChargeAnims : moveChargeAnims![0]); // TODO: is the bang correct? moveAnimations.push(moveChargeAnims instanceof AnimConfig ? moveChargeAnims : moveChargeAnims![0]); // TODO: is the bang correct?

View File

@ -1,4 +1,4 @@
import { CommonAnim, CommonBattleAnim } from "./battle-anims"; import { ChargeAnim, CommonAnim, CommonBattleAnim, MoveChargeAnim } from "./battle-anims";
import { CommonAnimPhase, MoveEffectPhase, MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangeCallback, StatChangePhase } from "../phases"; import { CommonAnimPhase, MoveEffectPhase, MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangeCallback, StatChangePhase } from "../phases";
import { getPokemonNameWithAffix } from "../messages"; import { getPokemonNameWithAffix } from "../messages";
import Pokemon, { MoveResult, HitResult } from "../field/pokemon"; import Pokemon, { MoveResult, HitResult } from "../field/pokemon";
@ -118,6 +118,44 @@ export class RechargingTag extends BattlerTag {
} }
} }
/**
* BattlerTag representing the "charge phase" of Beak Blast
* Pokemon with this tag will inflict BURN status on any attacker that makes contact.
* @see {@link https://bulbapedia.bulbagarden.net/wiki/Beak_Blast_(move) | Beak Blast}
*/
export class BeakBlastChargingTag extends BattlerTag {
constructor() {
super(BattlerTagType.BEAK_BLAST_CHARGING, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 1, Moves.BEAK_BLAST);
}
onAdd(pokemon: Pokemon): void {
// Play Beak Blast's charging animation
new MoveChargeAnim(ChargeAnim.BEAK_BLAST_CHARGING, this.sourceMove, pokemon).play(pokemon.scene);
// Queue Beak Blast's header message
pokemon.scene.queueMessage(i18next.t("moveTriggers:startedHeatingUpBeak", { pokemonName: getPokemonNameWithAffix(pokemon) }));
}
/**
* Inflicts `BURN` status on attackers that make contact, and causes this tag
* to be removed after the source makes a move (or the turn ends, whichever comes first)
* @param pokemon {@linkcode Pokemon} the owner of this tag
* @param lapseType {@linkcode BattlerTagLapseType} the type of functionality invoked in battle
* @returns `true` if invoked with the CUSTOM lapse type; `false` otherwise
*/
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
if (lapseType === BattlerTagLapseType.CUSTOM) {
const effectPhase = pokemon.scene.getCurrentPhase();
if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) {
const attacker = effectPhase.getPokemon();
attacker.trySetStatus(StatusEffect.BURN, true, pokemon);
}
return true;
}
return super.lapse(pokemon, lapseType);
}
}
export class TrappedTag extends BattlerTag { export class TrappedTag extends BattlerTag {
constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: number, sourceMove: Moves, sourceId: number) { constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: number, sourceMove: Moves, sourceId: number) {
super(tagType, lapseType, turnCount, sourceMove, sourceId); super(tagType, lapseType, turnCount, sourceMove, sourceId);
@ -1738,6 +1776,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
switch (tagType) { switch (tagType) {
case BattlerTagType.RECHARGING: case BattlerTagType.RECHARGING:
return new RechargingTag(sourceMove); return new RechargingTag(sourceMove);
case BattlerTagType.BEAK_BLAST_CHARGING:
return new BeakBlastChargingTag();
case BattlerTagType.FLINCHED: case BattlerTagType.FLINCHED:
return new FlinchedTag(sourceMove); return new FlinchedTag(sourceMove);
case BattlerTagType.INTERRUPTED: case BattlerTagType.INTERRUPTED:

View File

@ -273,11 +273,9 @@ export abstract class Challenge {
* @param valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. * @param valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed.
* @param dexAttr {@link DexAttrProps} The dex attributes of the pokemon. * @param dexAttr {@link DexAttrProps} The dex attributes of the pokemon.
* @param soft {@link boolean} If true, allow it if it could become a valid pokemon. * @param soft {@link boolean} If true, allow it if it could become a valid pokemon.
* @param checkEvolutions {@link boolean} If true, check the pokemon's future evolutions
* @param checkForms {@link boolean} If true, check the pokemon's alternative forms
* @returns {@link boolean} Whether this function did anything. * @returns {@link boolean} Whether this function did anything.
*/ */
applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false, checkEvolutions?: boolean, checkForms?: boolean): boolean { applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean {
return false; return false;
} }
@ -405,14 +403,13 @@ export class SingleGenerationChallenge extends Challenge {
super(Challenges.SINGLE_GENERATION, 9); super(Challenges.SINGLE_GENERATION, 9);
} }
applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false, checkEvolutions?: boolean): boolean { applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean {
const generations = [pokemon.generation]; const generations = [pokemon.generation];
const checkPokemonEvolutions = checkEvolutions ?? true as boolean;
if (soft) { if (soft) {
const speciesToCheck = [pokemon.speciesId]; const speciesToCheck = [pokemon.speciesId];
while (speciesToCheck.length) { while (speciesToCheck.length) {
const checking = speciesToCheck.pop(); const checking = speciesToCheck.pop();
if (checking && pokemonEvolutions.hasOwnProperty(checking) && checkPokemonEvolutions) { if (checking && pokemonEvolutions.hasOwnProperty(checking)) {
pokemonEvolutions[checking].forEach(e => { pokemonEvolutions[checking].forEach(e => {
speciesToCheck.push(e.speciesId); speciesToCheck.push(e.speciesId);
generations.push(getPokemonSpecies(e.speciesId).generation); generations.push(getPokemonSpecies(e.speciesId).generation);
@ -533,22 +530,20 @@ export class SingleTypeChallenge extends Challenge {
super(Challenges.SINGLE_TYPE, 18); super(Challenges.SINGLE_TYPE, 18);
} }
applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false, checkEvolutions?: boolean, checkForms?: boolean): boolean { applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean {
const speciesForm = getPokemonSpeciesForm(pokemon.speciesId, dexAttr.formIndex); const speciesForm = getPokemonSpeciesForm(pokemon.speciesId, dexAttr.formIndex);
const types = [speciesForm.type1, speciesForm.type2]; const types = [speciesForm.type1, speciesForm.type2];
const checkPokemonEvolutions = checkEvolutions ?? true as boolean;
const checkPokemonForms = checkForms ?? true as boolean;
if (soft) { if (soft) {
const speciesToCheck = [pokemon.speciesId]; const speciesToCheck = [pokemon.speciesId];
while (speciesToCheck.length) { while (speciesToCheck.length) {
const checking = speciesToCheck.pop(); const checking = speciesToCheck.pop();
if (checking && pokemonEvolutions.hasOwnProperty(checking) && checkPokemonEvolutions) { if (checking && pokemonEvolutions.hasOwnProperty(checking)) {
pokemonEvolutions[checking].forEach(e => { pokemonEvolutions[checking].forEach(e => {
speciesToCheck.push(e.speciesId); speciesToCheck.push(e.speciesId);
types.push(getPokemonSpecies(e.speciesId).type1, getPokemonSpecies(e.speciesId).type2); types.push(getPokemonSpecies(e.speciesId).type1, getPokemonSpecies(e.speciesId).type2);
}); });
} }
if (checking && pokemonFormChanges.hasOwnProperty(checking) && checkPokemonForms) { if (checking && pokemonFormChanges.hasOwnProperty(checking)) {
pokemonFormChanges[checking].forEach(f1 => { pokemonFormChanges[checking].forEach(f1 => {
getPokemonSpecies(checking).forms.forEach(f2 => { getPokemonSpecies(checking).forms.forEach(f2 => {
if (f1.formKey === f2.formKey) { if (f1.formKey === f2.formKey) {
@ -746,7 +741,7 @@ export class LowerStarterPointsChallenge extends Challenge {
* @param soft {@link boolean} If true, allow it if it could become a valid pokemon. * @param soft {@link boolean} If true, allow it if it could become a valid pokemon.
* @returns True if any challenge was successfully applied. * @returns True if any challenge was successfully applied.
*/ */
export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_CHOICE, pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean, checkEvolutions?: boolean, checkForms?: boolean): boolean; export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_CHOICE, pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean): boolean;
/** /**
* Apply all challenges that modify available total starter points. * Apply all challenges that modify available total starter points.
* @param gameMode {@link GameMode} The current gameMode * @param gameMode {@link GameMode} The current gameMode
@ -854,7 +849,7 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType
if (c.value !== 0) { if (c.value !== 0) {
switch (challengeType) { switch (challengeType) {
case ChallengeType.STARTER_CHOICE: case ChallengeType.STARTER_CHOICE:
ret ||= c.applyStarterChoice(args[0], args[1], args[2], args[3], args[4], args[5]); ret ||= c.applyStarterChoice(args[0], args[1], args[2], args[3]);
break; break;
case ChallengeType.STARTER_POINTS: case ChallengeType.STARTER_POINTS:
ret ||= c.applyStarterPoints(args[0]); ret ||= c.applyStarterPoints(args[0]);

View File

@ -1021,6 +1021,22 @@ export class MessageHeaderAttr extends MoveHeaderAttr {
} }
} }
/**
* Header attribute to implement the "charge phase" of Beak Blast at the
* beginning of a turn.
* @see {@link https://bulbapedia.bulbagarden.net/wiki/Beak_Blast_(move) | Beak Blast}
* @see {@linkcode BeakBlastChargingTag}
*/
export class BeakBlastHeaderAttr extends MoveHeaderAttr {
/** Required to initialize Beak Blast's charge animation correctly */
public chargeAnim = ChargeAnim.BEAK_BLAST_CHARGING;
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
user.addTag(BattlerTagType.BEAK_BLAST_CHARGING);
return true;
}
}
export class PreMoveMessageAttr extends MoveAttr { export class PreMoveMessageAttr extends MoveAttr {
private message: string | ((user: Pokemon, target: Pokemon, move: Move) => string); private message: string | ((user: Pokemon, target: Pokemon, move: Move) => string);
@ -2391,24 +2407,21 @@ export class ChargeAttr extends OverrideMoveEffectAttr {
private chargeText: string; private chargeText: string;
private tagType: BattlerTagType | null; private tagType: BattlerTagType | null;
private chargeEffect: boolean; private chargeEffect: boolean;
public sameTurn: boolean;
public followUpPriority: integer | null; public followUpPriority: integer | null;
constructor(chargeAnim: ChargeAnim, chargeText: string, tagType?: BattlerTagType | null, chargeEffect: boolean = false, sameTurn: boolean = false, followUpPriority?: integer) { constructor(chargeAnim: ChargeAnim, chargeText: string, tagType?: BattlerTagType | null, chargeEffect: boolean = false) {
super(); super();
this.chargeAnim = chargeAnim; this.chargeAnim = chargeAnim;
this.chargeText = chargeText; this.chargeText = chargeText;
this.tagType = tagType!; // TODO: is this bang correct? this.tagType = tagType!; // TODO: is this bang correct?
this.chargeEffect = chargeEffect; this.chargeEffect = chargeEffect;
this.sameTurn = sameTurn;
this.followUpPriority = followUpPriority!; // TODO: is this bang correct?
} }
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
return new Promise(resolve => { return new Promise(resolve => {
const lastMove = user.getLastXMoves().find(() => true); const lastMove = user.getLastXMoves().find(() => true);
if (!lastMove || lastMove.move !== move.id || (lastMove.result !== MoveResult.OTHER && (this.sameTurn || lastMove.turn !== user.scene.currentBattle.turn))) { if (!lastMove || lastMove.move !== move.id || (lastMove.result !== MoveResult.OTHER && lastMove.turn !== user.scene.currentBattle.turn)) {
(args[0] as Utils.BooleanHolder).value = true; (args[0] as Utils.BooleanHolder).value = true;
new MoveChargeAnim(this.chargeAnim, move.id, user).play(user.scene, () => { new MoveChargeAnim(this.chargeAnim, move.id, user).play(user.scene, () => {
user.scene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); user.scene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user)));
@ -2420,13 +2433,6 @@ export class ChargeAttr extends OverrideMoveEffectAttr {
} }
user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER });
user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true }); user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true });
if (this.sameTurn) {
let movesetMove = user.moveset.find(m => m?.moveId === move.id);
if (!movesetMove) { // account for any move that calls a ChargeAttr move when the ChargeAttr move does not exist in moveset
movesetMove = new PokemonMove(move.id, 0, 0, true);
}
user.scene.pushMovePhase(new MovePhase(user.scene, user, [ target.getBattlerIndex() ], movesetMove, true), this.followUpPriority!); // TODO: is this bang correct?
}
user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id);
resolve(true); resolve(true);
}); });
@ -2736,21 +2742,34 @@ export class InvertStatsAttr extends MoveEffectAttr {
} }
export class ResetStatsAttr extends MoveEffectAttr { export class ResetStatsAttr extends MoveEffectAttr {
private targetAllPokemon: boolean;
constructor(targetAllPokemon: boolean) {
super();
this.targetAllPokemon = targetAllPokemon;
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (!super.apply(user, target, move, args)) { if (!super.apply(user, target, move, args)) {
return false; return false;
} }
for (let s = 0; s < target.summonData.battleStats.length; s++) { if (this.targetAllPokemon) { // Target all pokemon on the field when Freezy Frost or Haze are used
target.summonData.battleStats[s] = 0; const activePokemon = user.scene.getField(true);
activePokemon.forEach(p => this.resetStats(p));
target.scene.queueMessage(i18next.t("moveTriggers:statEliminated"));
} else { // Affects only the single target when Clear Smog is used
this.resetStats(target);
target.scene.queueMessage(i18next.t("moveTriggers:resetStats", {pokemonName: getPokemonNameWithAffix(target)}));
} }
target.updateInfo();
user.updateInfo();
target.scene.queueMessage(i18next.t("moveTriggers:resetStats", {pokemonName: getPokemonNameWithAffix(target)}));
return true; return true;
} }
resetStats(pokemon: Pokemon) {
for (let s = 0; s < pokemon.summonData.battleStats.length; s++) {
pokemon.summonData.battleStats[s] = 0;
}
pokemon.updateInfo();
}
} }
/** /**
@ -4350,7 +4369,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr {
*/ */
export class GulpMissileTagAttr extends MoveEffectAttr { export class GulpMissileTagAttr extends MoveEffectAttr {
constructor() { constructor() {
super(true, MoveEffectTrigger.POST_APPLY); super(true);
} }
/** /**
@ -6431,9 +6450,8 @@ export function initMoves() {
new StatusMove(Moves.LIGHT_SCREEN, Type.PSYCHIC, -1, 30, -1, 0, 1) new StatusMove(Moves.LIGHT_SCREEN, Type.PSYCHIC, -1, 30, -1, 0, 1)
.attr(AddArenaTagAttr, ArenaTagType.LIGHT_SCREEN, 5, true) .attr(AddArenaTagAttr, ArenaTagType.LIGHT_SCREEN, 5, true)
.target(MoveTarget.USER_SIDE), .target(MoveTarget.USER_SIDE),
new StatusMove(Moves.HAZE, Type.ICE, -1, 30, -1, 0, 1) new SelfStatusMove(Moves.HAZE, Type.ICE, -1, 30, -1, 0, 1)
.target(MoveTarget.BOTH_SIDES) .attr(ResetStatsAttr, true),
.attr(ResetStatsAttr),
new StatusMove(Moves.REFLECT, Type.PSYCHIC, -1, 20, -1, 0, 1) new StatusMove(Moves.REFLECT, Type.PSYCHIC, -1, 20, -1, 0, 1)
.attr(AddArenaTagAttr, ArenaTagType.REFLECT, 5, true) .attr(AddArenaTagAttr, ArenaTagType.REFLECT, 5, true)
.target(MoveTarget.USER_SIDE), .target(MoveTarget.USER_SIDE),
@ -6948,7 +6966,7 @@ export function initMoves() {
.makesContact(false) .makesContact(false)
.partial(), .partial(),
new AttackMove(Moves.DIVE, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3) new AttackMove(Moves.DIVE, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3)
.attr(ChargeAttr, ChargeAnim.DIVE_CHARGING, i18next.t("moveTriggers:hidUnderwater", {pokemonName: "{USER}"}), BattlerTagType.UNDERWATER) .attr(ChargeAttr, ChargeAnim.DIVE_CHARGING, i18next.t("moveTriggers:hidUnderwater", {pokemonName: "{USER}"}), BattlerTagType.UNDERWATER, true)
.attr(GulpMissileTagAttr) .attr(GulpMissileTagAttr)
.ignoresVirtual(), .ignoresVirtual(),
new AttackMove(Moves.ARM_THRUST, Type.FIGHTING, MoveCategory.PHYSICAL, 15, 100, 20, -1, 0, 3) new AttackMove(Moves.ARM_THRUST, Type.FIGHTING, MoveCategory.PHYSICAL, 15, 100, 20, -1, 0, 3)
@ -7520,7 +7538,7 @@ export function initMoves() {
new AttackMove(Moves.CHIP_AWAY, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 5) new AttackMove(Moves.CHIP_AWAY, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 5)
.attr(IgnoreOpponentStatChangesAttr), .attr(IgnoreOpponentStatChangesAttr),
new AttackMove(Moves.CLEAR_SMOG, Type.POISON, MoveCategory.SPECIAL, 50, -1, 15, -1, 0, 5) new AttackMove(Moves.CLEAR_SMOG, Type.POISON, MoveCategory.SPECIAL, 50, -1, 15, -1, 0, 5)
.attr(ResetStatsAttr), .attr(ResetStatsAttr, false),
new AttackMove(Moves.STORED_POWER, Type.PSYCHIC, MoveCategory.SPECIAL, 20, 100, 10, -1, 0, 5) new AttackMove(Moves.STORED_POWER, Type.PSYCHIC, MoveCategory.SPECIAL, 20, 100, 10, -1, 0, 5)
.attr(StatChangeCountPowerAttr), .attr(StatChangeCountPowerAttr),
new StatusMove(Moves.QUICK_GUARD, Type.FIGHTING, -1, 15, -1, 3, 5) new StatusMove(Moves.QUICK_GUARD, Type.FIGHTING, -1, 15, -1, 3, 5)
@ -8088,11 +8106,10 @@ export function initMoves() {
.attr(StatChangeAttr, BattleStat.ATK, -1), .attr(StatChangeAttr, BattleStat.ATK, -1),
new StatusMove(Moves.INSTRUCT, Type.PSYCHIC, -1, 15, -1, 0, 7) new StatusMove(Moves.INSTRUCT, Type.PSYCHIC, -1, 15, -1, 0, 7)
.unimplemented(), .unimplemented(),
new AttackMove(Moves.BEAK_BLAST, Type.FLYING, MoveCategory.PHYSICAL, 100, 100, 15, -1, 5, 7) new AttackMove(Moves.BEAK_BLAST, Type.FLYING, MoveCategory.PHYSICAL, 100, 100, 15, -1, -3, 7)
.attr(ChargeAttr, ChargeAnim.BEAK_BLAST_CHARGING, i18next.t("moveTriggers:startedHeatingUpBeak", {pokemonName: "{USER}"}), undefined, false, true, -3) .attr(BeakBlastHeaderAttr)
.ballBombMove() .ballBombMove()
.makesContact(false) .makesContact(false),
.partial(),
new AttackMove(Moves.CLANGING_SCALES, Type.DRAGON, MoveCategory.SPECIAL, 110, 100, 5, -1, 0, 7) new AttackMove(Moves.CLANGING_SCALES, Type.DRAGON, MoveCategory.SPECIAL, 110, 100, 5, -1, 0, 7)
.attr(StatChangeAttr, BattleStat.DEF, -1, true, null, true, false, MoveEffectTrigger.HIT, true) .attr(StatChangeAttr, BattleStat.DEF, -1, true, null, true, false, MoveEffectTrigger.HIT, true)
.soundBased() .soundBased()
@ -8234,7 +8251,7 @@ export function initMoves() {
.makesContact(false) .makesContact(false)
.attr(AddBattlerTagAttr, BattlerTagType.SEEDED), .attr(AddBattlerTagAttr, BattlerTagType.SEEDED),
new AttackMove(Moves.FREEZY_FROST, Type.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7) new AttackMove(Moves.FREEZY_FROST, Type.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7)
.attr(ResetStatsAttr), .attr(ResetStatsAttr, true),
new AttackMove(Moves.SPARKLY_SWIRL, Type.FAIRY, MoveCategory.SPECIAL, 120, 85, 5, -1, 0, 7) new AttackMove(Moves.SPARKLY_SWIRL, Type.FAIRY, MoveCategory.SPECIAL, 120, 85, 5, -1, 0, 7)
.attr(PartyStatusCureAttr, null, Abilities.NONE), .attr(PartyStatusCureAttr, null, Abilities.NONE),
new AttackMove(Moves.VEEVEE_VOLLEY, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 20, -1, 0, 7) new AttackMove(Moves.VEEVEE_VOLLEY, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 20, -1, 0, 7)

View File

@ -2631,7 +2631,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.CHIKORITA]: [ [Species.CHIKORITA]: [
[ 1, Moves.TACKLE ], [ 1, Moves.TACKLE ],
[ 1, Moves.GROWL ], [ 1, Moves.GROWL ],
[ 6, Moves.RAZOR_LEAF ], [ 5, Moves.RAZOR_LEAF ], //Custom, moved from 6 to 5
[ 9, Moves.POISON_POWDER ], [ 9, Moves.POISON_POWDER ],
[ 12, Moves.SYNTHESIS ], [ 12, Moves.SYNTHESIS ],
[ 17, Moves.REFLECT ], [ 17, Moves.REFLECT ],
@ -2681,8 +2681,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.CYNDAQUIL]: [ [Species.CYNDAQUIL]: [
[ 1, Moves.TACKLE ], [ 1, Moves.TACKLE ],
[ 1, Moves.LEER ], [ 1, Moves.LEER ],
[ 6, Moves.SMOKESCREEN ], [ 5, Moves.EMBER ], //Custom, moved to 5
[ 10, Moves.EMBER ], [ 10, Moves.SMOKESCREEN ], //Custom, moved to 10
[ 13, Moves.QUICK_ATTACK ], [ 13, Moves.QUICK_ATTACK ],
[ 19, Moves.FLAME_WHEEL ], [ 19, Moves.FLAME_WHEEL ],
[ 22, Moves.DEFENSE_CURL ], [ 22, Moves.DEFENSE_CURL ],
@ -2736,7 +2736,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.TOTODILE]: [ [Species.TOTODILE]: [
[ 1, Moves.SCRATCH ], [ 1, Moves.SCRATCH ],
[ 1, Moves.LEER ], [ 1, Moves.LEER ],
[ 6, Moves.WATER_GUN ], [ 5, Moves.WATER_GUN ], //Custom, moved from 6 to 5
[ 9, Moves.BITE ], [ 9, Moves.BITE ],
[ 13, Moves.SCARY_FACE ], [ 13, Moves.SCARY_FACE ],
[ 19, Moves.ICE_FANG ], [ 19, Moves.ICE_FANG ],
@ -6723,7 +6723,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.TURTWIG]: [ [Species.TURTWIG]: [
[ 1, Moves.TACKLE ], [ 1, Moves.TACKLE ],
[ 5, Moves.WITHDRAW ], [ 5, Moves.WITHDRAW ],
[ 9, Moves.ABSORB ], [ 5, Moves.ABSORB ], //Custom, moved from 9 to 5
[ 13, Moves.RAZOR_LEAF ], [ 13, Moves.RAZOR_LEAF ],
[ 17, Moves.CURSE ], [ 17, Moves.CURSE ],
[ 21, Moves.BITE ], [ 21, Moves.BITE ],
@ -6768,7 +6768,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.CHIMCHAR]: [ [Species.CHIMCHAR]: [
[ 1, Moves.SCRATCH ], [ 1, Moves.SCRATCH ],
[ 1, Moves.LEER ], [ 1, Moves.LEER ],
[ 7, Moves.EMBER ], [ 5, Moves.EMBER ], //Custom, moved from 7 to 5
[ 9, Moves.TAUNT ], [ 9, Moves.TAUNT ],
[ 15, Moves.FURY_SWIPES ], [ 15, Moves.FURY_SWIPES ],
[ 17, Moves.FLAME_WHEEL ], [ 17, Moves.FLAME_WHEEL ],
@ -6817,7 +6817,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.PIPLUP]: [ [Species.PIPLUP]: [
[ 1, Moves.POUND ], [ 1, Moves.POUND ],
[ 4, Moves.GROWL ], [ 4, Moves.GROWL ],
[ 8, Moves.WATER_GUN ], [ 5, Moves.WATER_GUN ], //Custom, moved from 8 to 5
[ 11, Moves.CHARM ], [ 11, Moves.CHARM ],
[ 15, Moves.PECK ], [ 15, Moves.PECK ],
[ 18, Moves.BUBBLE_BEAM ], [ 18, Moves.BUBBLE_BEAM ],
@ -8591,7 +8591,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.SNIVY]: [ [Species.SNIVY]: [
[ 1, Moves.TACKLE ], [ 1, Moves.TACKLE ],
[ 4, Moves.LEER ], [ 4, Moves.LEER ],
[ 7, Moves.VINE_WHIP ], [ 5, Moves.VINE_WHIP ], //Custom, moved from 7 to 5
[ 10, Moves.WRAP ], [ 10, Moves.WRAP ],
[ 13, Moves.GROWTH ], [ 13, Moves.GROWTH ],
[ 16, Moves.MAGICAL_LEAF ], [ 16, Moves.MAGICAL_LEAF ],
@ -8639,7 +8639,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.TEPIG]: [ [Species.TEPIG]: [
[ 1, Moves.TACKLE ], [ 1, Moves.TACKLE ],
[ 3, Moves.TAIL_WHIP ], [ 3, Moves.TAIL_WHIP ],
[ 7, Moves.EMBER ], [ 5, Moves.EMBER ], //Custom, moved from 7 to 5
[ 9, Moves.ENDURE ], [ 9, Moves.ENDURE ],
[ 13, Moves.DEFENSE_CURL ], [ 13, Moves.DEFENSE_CURL ],
[ 15, Moves.FLAME_CHARGE ], [ 15, Moves.FLAME_CHARGE ],
@ -8693,7 +8693,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.OSHAWOTT]: [ [Species.OSHAWOTT]: [
[ 1, Moves.TACKLE ], [ 1, Moves.TACKLE ],
[ 5, Moves.TAIL_WHIP ], [ 5, Moves.TAIL_WHIP ],
[ 7, Moves.WATER_GUN ], [ 5, Moves.WATER_GUN ], //Custom, moved from 7 to 5
[ 11, Moves.SOAK ], [ 11, Moves.SOAK ],
[ 13, Moves.FOCUS_ENERGY ], [ 13, Moves.FOCUS_ENERGY ],
[ 17, Moves.RAZOR_SHELL ], [ 17, Moves.RAZOR_SHELL ],
@ -13850,11 +13850,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 99, Moves.CLOSE_COMBAT ], [ 99, Moves.CLOSE_COMBAT ],
], ],
[Species.POIPOLE]: [ [Species.POIPOLE]: [
[ RELEARN_MOVE, Moves.DRAGON_PULSE ], //Custom, made relearn
[ 1, Moves.GROWL ], [ 1, Moves.GROWL ],
[ 1, Moves.ACID ], [ 1, Moves.ACID ],
[ 1, Moves.PECK ], [ 1, Moves.PECK ],
[ 1, Moves.HELPING_HAND ], [ 1, Moves.HELPING_HAND ],
[ 1, Moves.DRAGON_PULSE ],
[ 7, Moves.FURY_ATTACK ], [ 7, Moves.FURY_ATTACK ],
[ 14, Moves.FELL_STINGER ], [ 14, Moves.FELL_STINGER ],
[ 21, Moves.CHARM ], [ 21, Moves.CHARM ],
@ -13969,7 +13969,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.GROOKEY]: [ [Species.GROOKEY]: [
[ 1, Moves.SCRATCH ], [ 1, Moves.SCRATCH ],
[ 1, Moves.GROWL ], [ 1, Moves.GROWL ],
[ 6, Moves.BRANCH_POKE ], [ 5, Moves.BRANCH_POKE ], //Custom, moved from 6 to 5
[ 8, Moves.TAUNT ], [ 8, Moves.TAUNT ],
[ 12, Moves.RAZOR_LEAF ], [ 12, Moves.RAZOR_LEAF ],
[ 17, Moves.SCREECH ], [ 17, Moves.SCREECH ],
@ -14014,7 +14014,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.SCORBUNNY]: [ [Species.SCORBUNNY]: [
[ 1, Moves.TACKLE ], [ 1, Moves.TACKLE ],
[ 1, Moves.GROWL ], [ 1, Moves.GROWL ],
[ 6, Moves.EMBER ], [ 5, Moves.EMBER ], //Custom, moved from 6 to 5
[ 8, Moves.QUICK_ATTACK ], [ 8, Moves.QUICK_ATTACK ],
[ 12, Moves.DOUBLE_KICK ], [ 12, Moves.DOUBLE_KICK ],
[ 17, Moves.FLAME_CHARGE ], [ 17, Moves.FLAME_CHARGE ],
@ -14056,7 +14056,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.SOBBLE]: [ [Species.SOBBLE]: [
[ 1, Moves.POUND ], [ 1, Moves.POUND ],
[ 1, Moves.GROWL ], [ 1, Moves.GROWL ],
[ 6, Moves.WATER_GUN ], [ 5, Moves.WATER_GUN ], //Custom, moved from 6 to 5
[ 8, Moves.BIND ], [ 8, Moves.BIND ],
[ 12, Moves.WATER_PULSE ], [ 12, Moves.WATER_PULSE ],
[ 17, Moves.TEARFUL_LOOK ], [ 17, Moves.TEARFUL_LOOK ],

View File

@ -115,11 +115,11 @@ export function getRandomStatusEffect(statusEffectA: StatusEffect, statusEffectB
* @param statusA The first Status * @param statusA The first Status
* @param statusB The second Status * @param statusB The second Status
*/ */
export function getRandomStatus(statusA: Status, statusB: Status): Status { export function getRandomStatus(statusA: Status | null, statusB: Status | null): Status | null {
if (statusA === undefined || statusA.effect === StatusEffect.NONE || statusA.effect === StatusEffect.FAINT) { if (!statusA || statusA.effect === StatusEffect.NONE || statusA.effect === StatusEffect.FAINT) {
return statusB; return statusB;
} }
if (statusB === undefined || statusB.effect === StatusEffect.NONE || statusB.effect === StatusEffect.FAINT) { if (!statusB || statusB.effect === StatusEffect.NONE || statusB.effect === StatusEffect.FAINT) {
return statusA; return statusA;
} }

View File

@ -66,5 +66,6 @@ export enum BattlerTagType {
IGNORE_GHOST = "IGNORE_GHOST", IGNORE_GHOST = "IGNORE_GHOST",
IGNORE_DARK = "IGNORE_DARK", IGNORE_DARK = "IGNORE_DARK",
GULP_MISSILE_ARROKUDA = "GULP_MISSILE_ARROKUDA", GULP_MISSILE_ARROKUDA = "GULP_MISSILE_ARROKUDA",
GULP_MISSILE_PIKACHU = "GULP_MISSILE_PIKACHU" GULP_MISSILE_PIKACHU = "GULP_MISSILE_PIKACHU",
BEAK_BLAST_CHARGING = "BEAK_BLAST_CHARGING"
} }

View File

@ -1081,6 +1081,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
(Overrides.OPP_PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE && !this.isPlayer())) { (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE && !this.isPlayer())) {
return true; return true;
} }
// Classic Final boss and Endless Minor/Major bosses do not have passive
const { currentBattle, gameMode } = this.scene;
const waveIndex = currentBattle?.waveIndex;
if (this instanceof EnemyPokemon &&
(currentBattle?.battleSpec === BattleSpec.FINAL_BOSS ||
gameMode.isEndlessMinorBoss(waveIndex) ||
gameMode.isEndlessMajorBoss(waveIndex))) {
return false;
}
return this.passive || this.isBoss(); return this.passive || this.isBoss();
} }
@ -3608,7 +3619,7 @@ export class PlayerPokemon extends Pokemon {
if (!this.isFainted()) { if (!this.isFainted()) {
// If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum // If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum
this.hp = Math.min(this.hp, this.stats[Stat.HP]); this.hp = Math.min(this.hp, this.stats[Stat.HP]);
this.status = getRandomStatus(this.status!, pokemon.status!); // Get a random valid status between the two // TODO: are the bangs correct? this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two
} else if (!pokemon.isFainted()) { } else if (!pokemon.isFainted()) {
// If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero // If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero
this.hp = Math.max(this.hp, 1); this.hp = Math.max(this.hp, 1);

View File

@ -11,6 +11,7 @@ import { BattleSpec } from "#enums/battle-spec";
import { BattlePhase, MovePhase, PokemonHealPhase } from "./phases"; import { BattlePhase, MovePhase, PokemonHealPhase } from "./phases";
import { getTypeRgb } from "./data/type"; import { getTypeRgb } from "./data/type";
import { getPokemonNameWithAffix } from "./messages"; import { getPokemonNameWithAffix } from "./messages";
import { SemiInvulnerableTag } from "./data/battler-tags";
export class FormChangePhase extends EvolutionPhase { export class FormChangePhase extends EvolutionPhase {
private formChange: SpeciesFormChange; private formChange: SpeciesFormChange;
@ -194,7 +195,7 @@ export class QuietFormChangePhase extends BattlePhase {
const preName = getPokemonNameWithAffix(this.pokemon); const preName = getPokemonNameWithAffix(this.pokemon);
if (!this.pokemon.isOnField()) { if (!this.pokemon.isOnField() || this.pokemon.getTag(SemiInvulnerableTag)) {
this.pokemon.changeForm(this.formChange).then(() => { this.pokemon.changeForm(this.formChange).then(() => {
this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), 1500); this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), 1500);
}); });

View File

@ -21,6 +21,7 @@ import {SettingKeyboard} from "#app/system/settings/settings-keyboard";
import TouchControl from "#app/touch-controls"; import TouchControl from "#app/touch-controls";
import { Button } from "#enums/buttons"; import { Button } from "#enums/buttons";
import { Device } from "#enums/devices"; import { Device } from "#enums/devices";
import MoveTouchControlsHandler from "./ui/settings/move-touch-controls-handler";
export interface DeviceMapping { export interface DeviceMapping {
[key: string]: number; [key: string]: number;
@ -105,6 +106,7 @@ export class InputsController {
public lastSource: string = "keyboard"; public lastSource: string = "keyboard";
private inputInterval: NodeJS.Timeout[] = new Array(); private inputInterval: NodeJS.Timeout[] = new Array();
private touchControls: TouchControl; private touchControls: TouchControl;
public moveTouchControlsHandler: MoveTouchControlsHandler;
/** /**
* Initializes a new instance of the game control system, setting up initial state and configurations. * Initializes a new instance of the game control system, setting up initial state and configurations.
@ -182,6 +184,7 @@ export class InputsController {
this.scene.input.keyboard?.on("keyup", this.keyboardKeyUp, this); this.scene.input.keyboard?.on("keyup", this.keyboardKeyUp, this);
} }
this.touchControls = new TouchControl(this.scene); this.touchControls = new TouchControl(this.scene);
this.moveTouchControlsHandler = new MoveTouchControlsHandler(this.touchControls);
} }
/** /**

View File

@ -93,6 +93,7 @@ export class LoadingScene extends SceneBase {
this.loadImage("shiny_star_small", "ui", "shiny_small.png"); this.loadImage("shiny_star_small", "ui", "shiny_small.png");
this.loadImage("shiny_star_small_1", "ui", "shiny_small_1.png"); this.loadImage("shiny_star_small_1", "ui", "shiny_small_1.png");
this.loadImage("shiny_star_small_2", "ui", "shiny_small_2.png"); this.loadImage("shiny_star_small_2", "ui", "shiny_small_2.png");
this.loadImage("favorite", "ui", "favorite.png");
this.loadImage("passive_bg", "ui", "passive_bg.png"); this.loadImage("passive_bg", "ui", "passive_bg.png");
this.loadAtlas("shiny_icons", "ui"); this.loadAtlas("shiny_icons", "ui");
this.loadImage("ha_capsule", "ui", "ha_capsule.png"); this.loadImage("ha_capsule", "ui", "ha_capsule.png");

View File

@ -16,6 +16,9 @@ export const filterBar: SimpleTranslationEntries = {
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction Unlocked",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction Locked",
"favorite": "Favorite",
"isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No",
"ribbon": "Ribbon", "ribbon": "Ribbon",
"hasWon": "Ribbon - Yes", "hasWon": "Ribbon - Yes",
"hasNotWon": "Ribbon - No", "hasNotWon": "Ribbon - No",

View File

@ -56,6 +56,7 @@ export const moveTriggers: SimpleTranslationEntries = {
"sacrificialFullRestore": "{{pokemonName}}'s Healing Wish\nwas granted!", "sacrificialFullRestore": "{{pokemonName}}'s Healing Wish\nwas granted!",
"invertStats": "{{pokemonName}}'s stat changes\nwere all reversed!", "invertStats": "{{pokemonName}}'s stat changes\nwere all reversed!",
"resetStats": "{{pokemonName}}'s stat changes\nwere eliminated!", "resetStats": "{{pokemonName}}'s stat changes\nwere eliminated!",
"statEliminated": "All stat changes were eliminated!",
"faintCountdown": "{{pokemonName}}\nwill faint in {{turnCount}} turns.", "faintCountdown": "{{pokemonName}}\nwill faint in {{turnCount}} turns.",
"copyType": "{{pokemonName}}'s type became the same as\n{{targetPokemonName}}'s type!", "copyType": "{{pokemonName}}'s type became the same as\n{{targetPokemonName}}'s type!",
"suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!", "suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!",

View File

@ -28,6 +28,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"toggleIVs": "Toggle IVs", "toggleIVs": "Toggle IVs",
"manageMoves": "Manage Moves", "manageMoves": "Manage Moves",
"manageNature": "Manage Nature", "manageNature": "Manage Nature",
"addToFavorites": "Add to Favorites",
"removeFromFavorites": "Remove from Favorites",
"useCandies": "Use Candies", "useCandies": "Use Candies",
"selectNature": "Select nature.", "selectNature": "Select nature.",
"selectMoveSwapOut": "Select a move to swap out.", "selectMoveSwapOut": "Select a move to swap out.",

View File

@ -1,7 +1,7 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const abilityTriggers: SimpleTranslationEntries = { export const abilityTriggers: SimpleTranslationEntries = {
"blockRecoilDamage" : "{{pokemonName}} wurde durch {{abilityName}} vor Rückstoß geschützt!", "blockRecoilDamage": "{{pokemonName}} wurde durch {{abilityName}} vor Rückstoß geschützt!",
"badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!", "badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!",
"costar": "{{pokemonName}} kopiert die Statusveränderungen von {{allyName}}!", "costar": "{{pokemonName}} kopiert die Statusveränderungen von {{allyName}}!",
"iceFaceAvoidedDamage": "{{pokemonName}} wehrt Schaden mit {{abilityName}} ab!", "iceFaceAvoidedDamage": "{{pokemonName}} wehrt Schaden mit {{abilityName}} ab!",

View File

@ -16,6 +16,9 @@ export const filterBar: SimpleTranslationEntries = {
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction Unlocked",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction Locked",
"favorite": "Favorite",
"isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No",
"ribbon": "Band", "ribbon": "Band",
"hasWon": "Hat Klassik-Modus gewonnen", "hasWon": "Hat Klassik-Modus gewonnen",
"hasNotWon": "Hat Klassik-Modus nicht gewonnen", "hasNotWon": "Hat Klassik-Modus nicht gewonnen",

View File

@ -56,6 +56,7 @@ export const moveTriggers: SimpleTranslationEntries = {
"sacrificialFullRestore": "Das Heilopfer von {{pokemonName}} erreicht sein Ziel!", "sacrificialFullRestore": "Das Heilopfer von {{pokemonName}} erreicht sein Ziel!",
"invertStats": "Alle Statusveränderungen von {{pokemonName}} wurden invertiert!", "invertStats": "Alle Statusveränderungen von {{pokemonName}} wurden invertiert!",
"resetStats": "Die Statusveränderungen von {{pokemonName}} wurden aufgehoben!", "resetStats": "Die Statusveränderungen von {{pokemonName}} wurden aufgehoben!",
"statEliminated": "Alle Statusveränderungen wurden aufgehoben!",
"faintCountdown": "{{pokemonName}} geht nach {{turnCount}} Runden K.O.!", "faintCountdown": "{{pokemonName}} geht nach {{turnCount}} Runden K.O.!",
"copyType": "{{pokemonName}} hat den Typ von {{targetPokemonName}} angenommen!", "copyType": "{{pokemonName}} hat den Typ von {{targetPokemonName}} angenommen!",
"suppressAbilities": "Die Fähigkeit von {{pokemonName}} wirkt nicht mehr!", "suppressAbilities": "Die Fähigkeit von {{pokemonName}} wirkt nicht mehr!",

View File

@ -5,4 +5,5 @@ export const pokemonInfoContainer: SimpleTranslationEntries = {
"gender": "Geschlecht:", "gender": "Geschlecht:",
"ability": "Fähigkeit:", "ability": "Fähigkeit:",
"nature": "Wesen:", "nature": "Wesen:",
"form": "Form:",
} as const; } as const;

View File

@ -3,6 +3,7 @@ import { PokemonInfoTranslationEntries } from "#app/interfaces/locales";
export const pokemonInfo: PokemonInfoTranslationEntries = { export const pokemonInfo: PokemonInfoTranslationEntries = {
Stat: { Stat: {
"HP": "KP", "HP": "KP",
"HPStat": "KP",
"HPshortened": "KP", "HPshortened": "KP",
"ATK": "Angriff", "ATK": "Angriff",
"ATKshortened": "Ang", "ATKshortened": "Ang",

View File

@ -97,5 +97,6 @@ export const settings: SimpleTranslationEntries = {
"controller": "Controller", "controller": "Controller",
"gamepadSupport": "Controllerunterstützung", "gamepadSupport": "Controllerunterstützung",
"showBgmBar": "Musiknamen anzeigen", "showBgmBar": "Musiknamen anzeigen",
"moveTouchControls": "Bewegung Touch Steuerung",
"shopOverlayOpacity": "Shop Overlay Deckkraft", "shopOverlayOpacity": "Shop Overlay Deckkraft",
} as const; } as const;

View File

@ -28,6 +28,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"toggleIVs": "DVs anzeigen/verbergen", "toggleIVs": "DVs anzeigen/verbergen",
"manageMoves": "Attacken ändern", "manageMoves": "Attacken ändern",
"manageNature": "Wesen ändern", "manageNature": "Wesen ändern",
"addToFavorites": "Add to Favorites",
"removeFromFavorites": "Remove from Favorites",
"useCandies": "Bonbons verwenden", "useCandies": "Bonbons verwenden",
"selectNature": "Wähle das neue Wesen.", "selectNature": "Wähle das neue Wesen.",
"selectMoveSwapOut": "Wähle die zu ersetzende Attacke.", "selectMoveSwapOut": "Wähle die zu ersetzende Attacke.",
@ -41,6 +43,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleAbility": ": Fähigkeit", "cycleAbility": ": Fähigkeit",
"cycleNature": ": Wesen", "cycleNature": ": Wesen",
"cycleVariant": ": Seltenheit", "cycleVariant": ": Seltenheit",
"goFilter": ": Zu den Filtern",
"enablePassive": "Passiv-Skill aktivieren", "enablePassive": "Passiv-Skill aktivieren",
"disablePassive": "Passiv-Skill deaktivieren", "disablePassive": "Passiv-Skill deaktivieren",
"locked": "Gesperrt", "locked": "Gesperrt",

View File

@ -16,6 +16,9 @@ export const filterBar: SimpleTranslationEntries = {
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction Unlocked",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction Locked",
"favorite": "Favorite",
"isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No",
"ribbon": "Ribbon", "ribbon": "Ribbon",
"hasWon": "Ribbon - Yes", "hasWon": "Ribbon - Yes",
"hasNotWon": "Ribbon - No", "hasNotWon": "Ribbon - No",

View File

@ -56,6 +56,7 @@ export const moveTriggers: SimpleTranslationEntries = {
"sacrificialFullRestore": "{{pokemonName}}'s Healing Wish\nwas granted!", "sacrificialFullRestore": "{{pokemonName}}'s Healing Wish\nwas granted!",
"invertStats": "{{pokemonName}}'s stat changes\nwere all reversed!", "invertStats": "{{pokemonName}}'s stat changes\nwere all reversed!",
"resetStats": "{{pokemonName}}'s stat changes\nwere eliminated!", "resetStats": "{{pokemonName}}'s stat changes\nwere eliminated!",
"statEliminated": "All stat changes were eliminated!",
"faintCountdown": "{{pokemonName}}\nwill faint in {{turnCount}} turns.", "faintCountdown": "{{pokemonName}}\nwill faint in {{turnCount}} turns.",
"copyType": "{{pokemonName}}'s type became the same as\n{{targetPokemonName}}'s type!", "copyType": "{{pokemonName}}'s type became the same as\n{{targetPokemonName}}'s type!",
"suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!", "suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!",

View File

@ -97,5 +97,6 @@ export const settings: SimpleTranslationEntries = {
"controller": "Controller", "controller": "Controller",
"gamepadSupport": "Gamepad Support", "gamepadSupport": "Gamepad Support",
"showBgmBar": "Show Music Names", "showBgmBar": "Show Music Names",
"moveTouchControls": "Move Touch Controls",
"shopOverlayOpacity": "Shop Overlay Opacity" "shopOverlayOpacity": "Shop Overlay Opacity"
} as const; } as const;

View File

@ -28,6 +28,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"toggleIVs": "Toggle IVs", "toggleIVs": "Toggle IVs",
"manageMoves": "Manage Moves", "manageMoves": "Manage Moves",
"manageNature": "Manage Nature", "manageNature": "Manage Nature",
"addToFavorites": "Add to Favorites",
"removeFromFavorites": "Remove from Favorites",
"useCandies": "Use Candies", "useCandies": "Use Candies",
"selectNature": "Select nature.", "selectNature": "Select nature.",
"selectMoveSwapOut": "Select a move to swap out.", "selectMoveSwapOut": "Select a move to swap out.",
@ -41,6 +43,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleAbility": ": Ability", "cycleAbility": ": Ability",
"cycleNature": ": Nature", "cycleNature": ": Nature",
"cycleVariant": ": Variant", "cycleVariant": ": Variant",
"goFilter": ": Go to filters",
"enablePassive": "Enable Passive", "enablePassive": "Enable Passive",
"disablePassive": "Disable Passive", "disablePassive": "Disable Passive",
"locked": "Locked", "locked": "Locked",

View File

@ -16,6 +16,9 @@ export const filterBar: SimpleTranslationEntries = {
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction Unlocked",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction Locked",
"favorite": "Favorite",
"isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No",
"ribbon": "Ribbon", "ribbon": "Ribbon",
"hasWon": "Ya ha ganado", "hasWon": "Ya ha ganado",
"hasNotWon": "Aún no ha ganado", "hasNotWon": "Aún no ha ganado",

View File

@ -56,6 +56,7 @@ export const moveTriggers: SimpleTranslationEntries = {
"sacrificialFullRestore": "{{pokemonName}}'s Healing Wish\nwas granted!", "sacrificialFullRestore": "{{pokemonName}}'s Healing Wish\nwas granted!",
"invertStats": "{{pokemonName}}'s stat changes\nwere all reversed!", "invertStats": "{{pokemonName}}'s stat changes\nwere all reversed!",
"resetStats": "{{pokemonName}}'s stat changes\nwere eliminated!", "resetStats": "{{pokemonName}}'s stat changes\nwere eliminated!",
"statEliminated": "¡Los cambios en estadísticas fueron eliminados!",
"faintCountdown": "{{pokemonName}}\nwill faint in {{turnCount}} turns.", "faintCountdown": "{{pokemonName}}\nwill faint in {{turnCount}} turns.",
"copyType": "{{pokemonName}}'s type\nchanged to match {{targetPokemonName}}'s!", "copyType": "{{pokemonName}}'s type\nchanged to match {{targetPokemonName}}'s!",
"suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!", "suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!",

View File

@ -97,5 +97,6 @@ export const settings: SimpleTranslationEntries = {
"controller": "Controller", "controller": "Controller",
"gamepadSupport": "Gamepad Support", "gamepadSupport": "Gamepad Support",
"showBgmBar": "Show Music Names", "showBgmBar": "Show Music Names",
"moveTouchControls": "Move Touch Controls",
"shopOverlayOpacity": "Opacidad de la fase de compra" "shopOverlayOpacity": "Opacidad de la fase de compra"
} as const; } as const;

View File

@ -28,6 +28,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"toggleIVs": "Mostrar IVs", "toggleIVs": "Mostrar IVs",
"manageMoves": "Cambiar movs.", "manageMoves": "Cambiar movs.",
"manageNature": "Cambiar natur.", "manageNature": "Cambiar natur.",
"addToFavorites": "Add to Favorites",
"removeFromFavorites": "Remove from Favorites",
"useCandies": "Usar Caramelos", "useCandies": "Usar Caramelos",
"selectNature": "Elige Natur.", "selectNature": "Elige Natur.",
"selectMoveSwapOut": "Elige el movimiento que sustituir.", "selectMoveSwapOut": "Elige el movimiento que sustituir.",
@ -41,6 +43,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleAbility": ": Habilidad", "cycleAbility": ": Habilidad",
"cycleNature": ": Naturaleza", "cycleNature": ": Naturaleza",
"cycleVariant": ": Variante", "cycleVariant": ": Variante",
"goFilter": ": Ir a filtros",
"enablePassive": "Activar Pasiva", "enablePassive": "Activar Pasiva",
"disablePassive": "Desactivar Pasiva", "disablePassive": "Desactivar Pasiva",
"locked": "Bloqueado", "locked": "Bloqueado",

View File

@ -16,6 +16,9 @@ export const filterBar: SimpleTranslationEntries = {
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction Unlocked",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction Locked",
"favorite": "Favorite",
"isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No",
"ribbon": "Ruban", "ribbon": "Ruban",
"hasWon": "Ruban - Oui", "hasWon": "Ruban - Oui",
"hasNotWon": "Ruban - Non", "hasNotWon": "Ruban - Non",

View File

@ -56,6 +56,7 @@ export const moveTriggers: SimpleTranslationEntries = {
"sacrificialFullRestore": "Le Vœu Soin est exaucé et profite\nà {{pokemonName}} !", "sacrificialFullRestore": "Le Vœu Soin est exaucé et profite\nà {{pokemonName}} !",
"invertStats": "Les changements de stats\nde {{pokemonName}} sont inversés !", "invertStats": "Les changements de stats\nde {{pokemonName}} sont inversés !",
"resetStats": "Les changements de stats\nde {{pokemonName}} ont tous été annulés !", "resetStats": "Les changements de stats\nde {{pokemonName}} ont tous été annulés !",
"statEliminated": "Les changements de stats ont tous été annulés !",
"faintCountdown": "{{pokemonName}}\nsera K.O. dans {{turnCount}} tours !", "faintCountdown": "{{pokemonName}}\nsera K.O. dans {{turnCount}} tours !",
"copyType": "{{pokemonName}} prend le type\nde {{targetPokemonName}} !", "copyType": "{{pokemonName}} prend le type\nde {{targetPokemonName}} !",
"suppressAbilities": "Le talent de {{pokemonName}}\na été rendu inactif !", "suppressAbilities": "Le talent de {{pokemonName}}\na été rendu inactif !",

View File

@ -97,5 +97,6 @@ export const settings: SimpleTranslationEntries = {
"controller": "Controller", "controller": "Controller",
"gamepadSupport": "Gamepad Support", "gamepadSupport": "Gamepad Support",
"showBgmBar": "Titre de la musique", "showBgmBar": "Titre de la musique",
"moveTouchControls": "Déplacer les contrôles tactiles",
"shopOverlayOpacity": "Opacité boutique" "shopOverlayOpacity": "Opacité boutique"
} as const; } as const;

View File

@ -28,6 +28,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"toggleIVs": "Voir les IV", "toggleIVs": "Voir les IV",
"manageMoves": "Modifier les Capacités", "manageMoves": "Modifier les Capacités",
"manageNature": "Modifier la Nature", "manageNature": "Modifier la Nature",
"addToFavorites": "Add to Favorites",
"removeFromFavorites": "Remove from Favorites",
"useCandies": "Utiliser des Bonbons", "useCandies": "Utiliser des Bonbons",
"selectNature": "Sélectionnez une nature.", "selectNature": "Sélectionnez une nature.",
"selectMoveSwapOut": "Sélectionnez la capacité à échanger.", "selectMoveSwapOut": "Sélectionnez la capacité à échanger.",
@ -41,6 +43,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleAbility": ": Talent", "cycleAbility": ": Talent",
"cycleNature": ": Nature", "cycleNature": ": Nature",
"cycleVariant": ": Variant", "cycleVariant": ": Variant",
"goFilter": ": Aller aux filtres",
"enablePassive": "Activer Passif", "enablePassive": "Activer Passif",
"disablePassive": "Désactiver Passif", "disablePassive": "Désactiver Passif",
"locked": "Verrouillé", "locked": "Verrouillé",

View File

@ -16,6 +16,9 @@ export const filterBar: SimpleTranslationEntries = {
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction Unlocked",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction Locked",
"favorite": "Favorite",
"isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No",
"ribbon": "Ribbon", "ribbon": "Ribbon",
"hasWon": "Ribbon - Yes", "hasWon": "Ribbon - Yes",
"hasNotWon": "Ribbon - No", "hasNotWon": "Ribbon - No",

View File

@ -56,6 +56,7 @@ export const moveTriggers: SimpleTranslationEntries = {
"sacrificialFullRestore": "{{pokemonName}} riceve i benefici\neffetti di Curardore!", "sacrificialFullRestore": "{{pokemonName}} riceve i benefici\neffetti di Curardore!",
"invertStats": "Le modifiche alle statistiche di {{pokemonName}}\nvengono invertite!", "invertStats": "Le modifiche alle statistiche di {{pokemonName}}\nvengono invertite!",
"resetStats": "Tutte le modifiche alle statistiche sono state annullate!", "resetStats": "Tutte le modifiche alle statistiche sono state annullate!",
"statEliminated": "All stat changes were eliminated!",
"faintCountdown": "{{pokemonName}}\nandrà KO dopo {{turnCount}} turni.", "faintCountdown": "{{pokemonName}}\nandrà KO dopo {{turnCount}} turni.",
"copyType": "{{pokemonName}} assume il tipo\ndi {{targetPokemonName}}!", "copyType": "{{pokemonName}} assume il tipo\ndi {{targetPokemonName}}!",
"suppressAbilities": "Labilità di {{pokemonName}}\nperde ogni efficacia!", "suppressAbilities": "Labilità di {{pokemonName}}\nperde ogni efficacia!",

View File

@ -97,5 +97,6 @@ export const settings: SimpleTranslationEntries = {
"controller": "Controller", "controller": "Controller",
"gamepadSupport": "Supporto Gamepad", "gamepadSupport": "Supporto Gamepad",
"showBgmBar": "Mostra Nomi Musica", "showBgmBar": "Mostra Nomi Musica",
"moveTouchControls": "Move Touch Controls",
"shopOverlayOpacity": "Opacità Finestra Negozio" "shopOverlayOpacity": "Opacità Finestra Negozio"
} as const; } as const;

View File

@ -28,6 +28,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"toggleIVs": "Vedi/Nascondi IV", "toggleIVs": "Vedi/Nascondi IV",
"manageMoves": "Gestisci mosse", "manageMoves": "Gestisci mosse",
"manageNature": "Gestisci natura", "manageNature": "Gestisci natura",
"addToFavorites": "Add to Favorites",
"removeFromFavorites": "Remove from Favorites",
"useCandies": "Usa caramelle", "useCandies": "Usa caramelle",
"selectNature": "Seleziona natura.", "selectNature": "Seleziona natura.",
"selectMoveSwapOut": "Seleziona una mossa da scambiare.", "selectMoveSwapOut": "Seleziona una mossa da scambiare.",
@ -41,6 +43,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleAbility": ": Abilità", "cycleAbility": ": Abilità",
"cycleNature": ": Natura", "cycleNature": ": Natura",
"cycleVariant": ": Variante", "cycleVariant": ": Variante",
"goFilter": ": Go to filters",
"enablePassive": "Attiva passiva", "enablePassive": "Attiva passiva",
"disablePassive": "Disattiva passiva", "disablePassive": "Disattiva passiva",
"locked": "Bloccato", "locked": "Bloccato",

View File

@ -1,62 +1,63 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const abilityTriggers: SimpleTranslationEntries = { export const abilityTriggers: SimpleTranslationEntries = {
"blockRecoilDamage" : "{{pokemonName}}は {{abilityName}}で\nはんどうダメージを うけない!", "blockRecoilDamage" : "{{pokemonName}}は {{abilityName}}で 反動ダメージを 受けない!",
"badDreams": "{{pokemonName}}は ナイトメアに うなされている!", "badDreams": "{{pokemonName}}は ナイトメアに うなされている!",
"costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", "costar": "{{pokemonName}}は {{allyName}}の\n能力変化を コピーした",
"iceFaceAvoidedDamage": "{{pokemonName}}は\n{{abilityName}}で ダメージを うけない!", "iceFaceAvoidedDamage": "{{pokemonName}}は\n{{abilityName}}で ダメージを 受けない!",
"perishBody": "{{pokemonName}}の {{abilityName}}で\nおたがいは 3ターンごに ほろびてしまう!", "perishBody": "{{pokemonName}}の {{abilityName}}で\nおたがいは 3ターン後に ほろびいてしまう",
"poisonHeal": "{{pokemonName}}は {{abilityName}}で\nかいふくした", "poisonHeal": "{{pokemonName}}は {{abilityName}}で 回復した!",
"trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "trace": "{{pokemonName}}は 相手の {{targetName}}の\n{{abilityName}}を トレースした!",
"windPowerCharged": "{{pokemonName}}は\n{{moveName}}を うけて じゅうでんした!", "windPowerCharged": "{{pokemonName}}は\n{{moveName}}を 受けて じゅうでんした!",
"quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", "quickDraw": "{{pokemonName}}は クイックドロウで\n行動が はやくなった",
"blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", "blockItemTheft": "{{pokemonNameWithAffix}}の {{abilityName}}で\n道具を うばわれない",
"typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", "typeImmunityHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で\nダメージを 受けない。",
"postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!", "postDefendDisguise": "{{pokemonNameWithAffix}}の\nばけのかわが はがれた",
"moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!", "moveImmunity": "{{pokemonNameWithAffix}}には\n効果が ないようだ…",
"reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!", "reverseDrain": "{{pokemonNameWithAffix}}は\nヘドロえきを 吸い取った",
"postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!", "postDefendTypeChange": "{{pokemonNameWithAffix}}は {{abilityName}}で\n{{typeName}}タイプに なった!",
"postDefendContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", "postDefendContactDamage": "{{pokemonNameWithAffix}}は {{abilityName}}で\n相手を キズつけた",
"postDefendAbilitySwap": "{{pokemonNameWithAffix}} swapped\nabilities with its target!", "postDefendAbilitySwap": "{{pokemonNameWithAffix}}は\nおたがいの 特性を 入れ替えた",
"postDefendAbilityGive": "{{pokemonNameWithAffix}} gave its target\n{{abilityName}}!", "postDefendAbilityGive": "{{pokemonNameWithAffix}}は\n特性が {{abilityName}}に なっちゃった!",
"postDefendMoveDisable": "{{pokemonNameWithAffix}}'s {{moveName}}\nwas disabled!", "postDefendMoveDisable": "{{pokemonNameWithAffix}}の\n{{moveName}}を 封じこめた!",
"pokemonTypeChange": "{{pokemonNameWithAffix}} transformed into the {{moveType}} type!", "pokemonTypeChange": "{{pokemonNameWithAffix}}は\n{{moveType}}タイプに なった!",
"postAttackStealHeldItem": "{{pokemonNameWithAffix}} stole\n{{defenderName}}'s {{stolenItemType}}!", "postAttackStealHeldItem": "{{pokemonNameWithAffix}}は {{defenderName}}から\n{{stolenItemType}}を うばいとった!",
"postDefendStealHeldItem": "{{pokemonNameWithAffix}} stole\n{{attackerName}}'s {{stolenItemType}}!", "postDefendStealHeldItem": "{{pokemonNameWithAffix}}は {{attackerName}}から\n{{stolenItemType}}を うばいとった!",
"copyFaintedAllyAbility": "{{pokemonNameWithAffix}}'s {{abilityName}} was taken over!", "copyFaintedAllyAbility": "{{pokemonNameWithAffix}}の\n{{abilityName}}を 引き継いだ!",
"intimidateImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}} prevented it from being Intimidated!", "intimidateImmunity": "{{pokemonNameWithAffix}}は\n{{abilityName}}の 効果で 能力が 下がらない!",
"postSummonAllyHeal": "{{pokemonNameWithAffix}} drank down all the\nmatcha that {{pokemonName}} made!", "postSummonAllyHeal": "{{pokemonNameWithAffix}}が たてた お茶を\n{{pokemonName}}は 飲みほした!",
"postSummonClearAllyStats": "{{pokemonNameWithAffix}}'s stat changes\nwere removed!", "postSummonClearAllyStats": "{{pokemonNameWithAffix}}の\n能力変化が 元に戻った",
"postSummonTransform": "{{pokemonNameWithAffix}} transformed\ninto {{targetName}}!", "postSummonTransform": "{{pokemonNameWithAffix}}は\n{{targetName}}に 変身した!",
"protectStat": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents lowering its {{statName}}!", "protectStat": "{{pokemonNameWithAffix}}は {{abilityName}}の 効果で\n{{statName}}が 下がらない!",
"statusEffectImmunityWithName": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{statusEffectName}}!", "statusEffectImmunityWithName": "{{pokemonNameWithAffix}}は {{abilityName}}で\{{statusEffectName}}に ならない!",
"statusEffectImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents status problems!", "statusEffectImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で\n状態異常に ならない",
"battlerTagImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{battlerTagName}}!", "battlerTagImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で]\n{{battlerTagName}}を 無視した!",
"forewarn": "{{pokemonNameWithAffix}} was forewarned about {{moveName}}!", "forewarn": "{{pokemonNameWithAffix}}の\n{{moveName}}を 読み取った!",
"frisk": "{{pokemonNameWithAffix}} frisked {{opponentName}}'s {{opponentAbilityName}}!", "frisk": "{{pokemonNameWithAffix}}は {{opponentName}}の\n{{opponentAbilityName}}を お見通しだ!",
"postWeatherLapseHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", "postWeatherLapseHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した",
"postWeatherLapseDamage": "{{pokemonNameWithAffix}} is hurt\nby its {{abilityName}}!", "postWeatherLapseDamage": "{{pokemonNameWithAffix}}は\n{{abilityName}}の ダメージを 受けた!",
"postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} harvested one {{berryName}}!", "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}}は\n{{berryName}}を 収穫した!",
"postTurnHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", "postTurnHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した",
"fetchBall": "{{pokemonNameWithAffix}} found a\n{{pokeballName}}!", "fetchBall": "{{pokemonNameWithAffix}}は\n{{pokeballName}}を 拾ってきた!",
"healFromBerryUse": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP!", "healFromBerryUse": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した",
"arenaTrap": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents switching!", "arenaTrap": "{{pokemonNameWithAffix}}の {{abilityName}}で\n入れ替えることが できない",
"postBattleLoot": "{{pokemonNameWithAffix}} picked up\n{{itemName}}!", "postBattleLoot": "{{pokemonNameWithAffix}}は\n{{itemName}}を 拾った!",
"postFaintContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", "postFaintContactDamage": "{{pokemonNameWithAffix}}は {{abilityName}}で\n相手に ダメージを 与えた!",
"postFaintHpDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", "postFaintHpDamage": "{{pokemonNameWithAffix}}は {{abilityName}}で\n相手に ダメージを 与えた",
"postSummonPressure": "{{pokemonNameWithAffix}} is exerting its Pressure!", "postSummonPressure": "{{pokemonNameWithAffix}}は\nプレッシャーを 放っている",
"postSummonMoldBreaker": "{{pokemonNameWithAffix}} breaks the mold!", "postSummonMoldBreaker": "{{pokemonNameWithAffix}}は\nかたやぶりだ",
"postSummonAnticipation": "{{pokemonNameWithAffix}} shuddered!", "postSummonAnticipation": "{{pokemonNameWithAffix}}は\nみぶるいした",
"postSummonTurboblaze": "{{pokemonNameWithAffix}} is radiating a blazing aura!", "postSummonTurboblaze": "{{pokemonNameWithAffix}}は\n燃え盛(もえさか)る オーラを 放っている!",
"postSummonTeravolt": "{{pokemonNameWithAffix}} is radiating a bursting aura!", "postSummonTeravolt": "{{pokemonNameWithAffix}}は\n弾(はじ)ける オーラを 放っている!",
"postSummonDarkAura": "{{pokemonNameWithAffix}} is radiating a Dark Aura!", "postSummonDarkAura": "{{pokemonNameWithAffix}}は\nダークオーラを 放っている",
"postSummonFairyAura": "{{pokemonNameWithAffix}} is radiating a Fairy Aura!", "postSummonFairyAura": "{{pokemonNameWithAffix}}は\nフェアリーオーラを 放っている",
"postSummonNeutralizingGas": "{{pokemonNameWithAffix}}'s Neutralizing Gas filled the area!", "postSummonNeutralizingGas": "あたりに かがくへんかガスが 充満した!",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} has two Abilities!", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}は\nふたつの 特性を あわせ持つ",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} has two Abilities!", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}は\nふたつの 特性を あわせ持つ",
"postSummonVesselOfRuin": "{{pokemonNameWithAffix}}'s Vessel of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonVesselOfRuin": "{{pokemonNameWithAffix}}の わざわいのうつわで\nまわりの {{statName}}が 弱まった!",
"postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}の わざわいのつるぎで\nまわりの {{statName}}が 弱まった!",
"postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}の わざわいのおふだ\nまわりの {{statName}}が 弱まった!",
"postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}の わざわいのたまで\nまわりの {{statName}}が 弱まった!",
"preventBerryUse": "{{pokemonNameWithAffix}}は 緊張して\nきのみが 食べられなくなった",
} as const; } as const;

View File

@ -3,171 +3,171 @@ import { AchievementTranslationEntries } from "#app/interfaces/locales.js";
// Achievement translations for the when the player character is male // Achievement translations for the when the player character is male
export const PGMachv: AchievementTranslationEntries = { export const PGMachv: AchievementTranslationEntries = {
"Achievements": { "Achievements": {
name: "Achievements", name: "実績",
}, },
"Locked": { "Locked": {
name: "Locked", name: "なし",
}, },
"MoneyAchv": { "MoneyAchv": {
description: "Accumulate a total of ₽{{moneyAmount}}", description: "一回の ランで ₽{{moneyAmount}}を 稼ぐ",
}, },
"10K_MONEY": { "10K_MONEY": {
name: "Money Haver", name: "お金を持つ人",
}, },
"100K_MONEY": { "100K_MONEY": {
name: "Rich", name: "富豪",
}, },
"1M_MONEY": { "1M_MONEY": {
name: "Millionaire", name: "百万長者",
}, },
"10M_MONEY": { "10M_MONEY": {
name: "One Percenter", name: "超富裕層",
}, },
"DamageAchv": { "DamageAchv": {
description: "Inflict {{damageAmount}} damage in one hit", description: "一撃で {{damageAmount}}ダメージを 与える",
}, },
"250_DMG": { "250_DMG": {
name: "Hard Hitter", name: "力持ち",
}, },
"1000_DMG": { "1000_DMG": {
name: "Harder Hitter", name: "強者",
}, },
"2500_DMG": { "2500_DMG": {
name: "That's a Lotta Damage!", name: "カカロット",
}, },
"10000_DMG": { "10000_DMG": {
name: "One Punch Man", name: "ワンパンマン",
}, },
"HealAchv": { "HealAchv": {
description: "Heal {{healAmount}} {{HP}} at once with a move, ability, or held item", description: "一つの 技や 特性や 持っているアイテムで {{healAmount}}{{HP}}を 一気に 回復する",
}, },
"250_HEAL": { "250_HEAL": {
name: "Novice Healer", name: "回復発見者",
}, },
"1000_HEAL": { "1000_HEAL": {
name: "Big Healer", name: "大いなる治療者",
}, },
"2500_HEAL": { "2500_HEAL": {
name: "Cleric", name: "回復達人",
}, },
"10000_HEAL": { "10000_HEAL": {
name: "Recovery Master", name: "ジョーイさん",
}, },
"LevelAchv": { "LevelAchv": {
description: "Level up a Pokémon to Lv{{level}}", description: "一つの ポケモンを Lv{{level}}まで レベルアップする",
}, },
"LV_100": { "LV_100": {
name: "But Wait, There's More!", name: "まだまだだよ",
}, },
"LV_250": { "LV_250": {
name: "Elite", name: "天王",
}, },
"LV_1000": { "LV_1000": {
name: "To Go Even Further Beyond", name: "向こうの向こうを超え",
}, },
"RibbonAchv": { "RibbonAchv": {
description: "Accumulate a total of {{ribbonAmount}} Ribbons", description: "{{ribbonAmount}}巻の リボンを 積もる",
}, },
"10_RIBBONS": { "10_RIBBONS": {
name: "Pokémon League Champion", name: "ポケモンリーグチャンピオン",
}, },
"25_RIBBONS": { "25_RIBBONS": {
name: "Great League Champion", name: "スーパーリーグチャンピオン",
}, },
"50_RIBBONS": { "50_RIBBONS": {
name: "Ultra League Champion", name: "ハイパーリーグチャンピオン",
}, },
"75_RIBBONS": { "75_RIBBONS": {
name: "Rogue League Champion", name: "ローグリーグチャンピオン",
}, },
"100_RIBBONS": { "100_RIBBONS": {
name: "Master League Champion", name: "マスターリーグチャンピオン",
}, },
"TRANSFER_MAX_BATTLE_STAT": { "TRANSFER_MAX_BATTLE_STAT": {
name: "Teamwork", name: "同力",
description: "Baton pass to another party member with at least one stat maxed out", description: "少なくとも 一つの 能力を 最大まで あげて 他の 手持ちポケモンに バトンタッチする",
}, },
"MAX_FRIENDSHIP": { "MAX_FRIENDSHIP": {
name: "Friendmaxxing", name: "マブ達",
description: "Reach max friendship on a Pokémon", description: "一つの 手持ちポケモンの 仲良し度を 最大に 上げる",
}, },
"MEGA_EVOLVE": { "MEGA_EVOLVE": {
name: "Megamorph", name: "ザ・アブソリュート",
description: "Mega evolve a Pokémon", description: "一つの 手持ちポケモンを メガシンカさせる",
}, },
"GIGANTAMAX": { "GIGANTAMAX": {
name: "Absolute Unit", name: "太―くて 堪らない",
description: "Gigantamax a Pokémon", description: "一つの 手持ちポケモンを キョダイマックスさせる",
}, },
"TERASTALLIZE": { "TERASTALLIZE": {
name: "STAB Enthusiast", name: "一致好き",
description: "Terastallize a Pokémon", description: "一つの 手持ちポケモンを テラスタルさせる",
}, },
"STELLAR_TERASTALLIZE": { "STELLAR_TERASTALLIZE": {
name: "The Hidden Type", name: "隠れたタイプ",
description: "Stellar Terastallize a Pokémon", description: "一つの 手持ちポケモンを ステラ・テラスタルさせる",
}, },
"SPLICE": { "SPLICE": {
name: "Infinite Fusion", name: "インフィニット・フュジョン",
description: "Splice two Pokémon together with DNA Splicers", description: "いでんしのくさびで 二つの ポケモンを 吸収合体させる",
}, },
"MINI_BLACK_HOLE": { "MINI_BLACK_HOLE": {
name: "A Hole Lot of Items", name: "アイテムホーリック",
description: "Acquire a Mini Black Hole", description: "ミニブラックホールを 手に入れる",
}, },
"CATCH_MYTHICAL": { "CATCH_MYTHICAL": {
name: "Mythical", name: "",
description: "Catch a mythical Pokémon", description: "幻の ポケモンを 捕まえる",
}, },
"CATCH_SUB_LEGENDARY": { "CATCH_SUB_LEGENDARY": {
name: "(Sub-)Legendary", name: "準・伝説",
description: "Catch a sub-legendary Pokémon", description: "準伝説の ポケモンを 捕まえる",
}, },
"CATCH_LEGENDARY": { "CATCH_LEGENDARY": {
name: "Legendary", name: "ザ・伝説",
description: "Catch a legendary Pokémon", description: "伝説の ポケモンを 捕まえる",
}, },
"SEE_SHINY": { "SEE_SHINY": {
name: "Shiny", name: "色とりどりに光る",
description: "Find a shiny Pokémon in the wild", description: "野生の 色違いポケモンを みつける",
}, },
"SHINY_PARTY": { "SHINY_PARTY": {
name: "That's Dedication", name: "きらきら努力家",
description: "Have a full party of shiny Pokémon", description: "手持ちポケモンは 全員 色違いポケモンに する",
}, },
"HATCH_MYTHICAL": { "HATCH_MYTHICAL": {
name: "Mythical Egg", name: "幻のタマゴ",
description: "Hatch a mythical Pokémon from an egg", description: "幻の ポケモンを タマゴから 生まれる",
}, },
"HATCH_SUB_LEGENDARY": { "HATCH_SUB_LEGENDARY": {
name: "Sub-Legendary Egg", name: "準伝説のタマゴ",
description: "Hatch a sub-legendary Pokémon from an egg", description: "準伝説の ポケモンを タマゴから 生まれる",
}, },
"HATCH_LEGENDARY": { "HATCH_LEGENDARY": {
name: "Legendary Egg", name: "伝説のタマゴ",
description: "Hatch a legendary Pokémon from an egg", description: "伝説の ポケモンを タマゴから 生まれる",
}, },
"HATCH_SHINY": { "HATCH_SHINY": {
name: "Shiny Egg", name: "色違いタマゴ",
description: "Hatch a shiny Pokémon from an egg", description: "色違いポケモンを タマゴから 生まれる",
}, },
"HIDDEN_ABILITY": { "HIDDEN_ABILITY": {
name: "Hidden Potential", name: "底力",
description: "Catch a Pokémon with a hidden ability", description: "隠れ特性がある ポケモンを 捕まえる",
}, },
"PERFECT_IVS": { "PERFECT_IVS": {
name: "Certificate of Authenticity", name: "個体値の賞状",
description: "Get perfect IVs on a Pokémon", description: "一つの ポケモンの 個体値を すべて 最大に する",
}, },
"CLASSIC_VICTORY": { "CLASSIC_VICTORY": {
name: "Undefeated", name: "無双",
description: "Beat the game in classic mode", description: "クラシックモードを クリアする",
}, },
"UNEVOLVED_CLASSIC_VICTORY": { "UNEVOLVED_CLASSIC_VICTORY": {
name: "Bring Your Child To Work Day", name: "Bring Your Child To Work Day",
@ -175,102 +175,102 @@ export const PGMachv: AchievementTranslationEntries = {
}, },
"MONO_GEN_ONE": { "MONO_GEN_ONE": {
name: "The Original Rival", name: "原始",
description: "Complete the generation one only challenge.", description: "1世代の 単一世代チャレンジを クリアする",
}, },
"MONO_GEN_TWO": { "MONO_GEN_TWO": {
name: "Generation 1.5", name: "懐かしいカンジョウ",
description: "Complete the generation two only challenge.", description: "2世代の 単一世代チャレンジを クリアする",
}, },
"MONO_GEN_THREE": { "MONO_GEN_THREE": {
name: "Too much water?", name: "水浸し",
description: "Complete the generation three only challenge.", description: "3世代の 単一世代チャレンジを クリアする",
}, },
"MONO_GEN_FOUR": { "MONO_GEN_FOUR": {
name: "Is she really the hardest?", name: "神々の地",
description: "Complete the generation four only challenge.", description: "4世代の 単一世代チャレンジを クリアする",
}, },
"MONO_GEN_FIVE": { "MONO_GEN_FIVE": {
name: "All Original", name: "ニューヨーカー",
description: "Complete the generation five only challenge.", description: "5世代の 単一世代チャレンジを クリアする",
}, },
"MONO_GEN_SIX": { "MONO_GEN_SIX": {
name: "Almost Royalty", name: "サヴァ・サヴァ",
description: "Complete the generation six only challenge.", description: "6世代の 単一世代チャレンジを クリアする",
}, },
"MONO_GEN_SEVEN": { "MONO_GEN_SEVEN": {
name: "Only Technically", name: "アローラ・オエ",
description: "Complete the generation seven only challenge.", description: "7世代の 単一世代チャレンジを クリアする",
}, },
"MONO_GEN_EIGHT": { "MONO_GEN_EIGHT": {
name: "A Champion Time!", name: "チャンピオン タイムを 楽しめ!",
description: "Complete the generation eight only challenge.", description: "8世代の 単一世代チャレンジを クリアする",
}, },
"MONO_GEN_NINE": { "MONO_GEN_NINE": {
name: "She was going easy on you", name: "ネモに甘えたでしょう",
description: "Complete the generation nine only challenge.", description: "9世代の 単一世代チャレンジを クリアする",
}, },
"MonoType": { "MonoType": {
description: "Complete the {{type}} monotype challenge.", description: "{{type}}タイプの 単一タイプチャレンジを クリアする",
}, },
"MONO_NORMAL": { "MONO_NORMAL": {
name: "Extra Ordinary", name: "凡人",
}, },
"MONO_FIGHTING": { "MONO_FIGHTING": {
name: "I Know Kung Fu", name: "八千以上だ!!",
}, },
"MONO_FLYING": { "MONO_FLYING": {
name: "Angry Birds", name: "翼をください",
}, },
"MONO_POISON": { "MONO_POISON": {
name: "Kanto's Favourite", name: "カントーの名物",
}, },
"MONO_GROUND": { "MONO_GROUND": {
name: "Forecast: Earthquakes", name: "自信でユラユラ",
}, },
"MONO_ROCK": { "MONO_ROCK": {
name: "Brock Hard", name: "タケシの挑戦状",
}, },
"MONO_BUG": { "MONO_BUG": {
name: "You Like Jazz?", name: "チョウチョウせん者",
}, },
"MONO_GHOST": { "MONO_GHOST": {
name: "Who You Gonna Call?", name: "貞子ちゃん",
}, },
"MONO_STEEL": { "MONO_STEEL": {
name: "Iron Giant", name: "ハガネーター",
}, },
"MONO_FIRE": { "MONO_FIRE": {
name: "I Cast Fireball!", name: "NIGHT OF FIRE",
}, },
"MONO_WATER": { "MONO_WATER": {
name: "When It Rains, It Pours", name: "土砂降リスト",
}, },
"MONO_GRASS": { "MONO_GRASS": {
name: "Can't Touch This", name: "",
}, },
"MONO_ELECTRIC": { "MONO_ELECTRIC": {
name: "Aim For The Horn!", name: "パチピカペコ",
}, },
"MONO_PSYCHIC": { "MONO_PSYCHIC": {
name: "Big Brain Energy", name: "陽キャ",
}, },
"MONO_ICE": { "MONO_ICE": {
name: "Walking On Thin Ice", name: "ありのまま",
}, },
"MONO_DRAGON": { "MONO_DRAGON": {
name: "Pseudo-Legend Club", name: "龍が如く",
}, },
"MONO_DARK": { "MONO_DARK": {
name: "It's Just A Phase", name: "陰キャ",
}, },
"MONO_FAIRY": { "MONO_FAIRY": {
name: "Hey! Listen!", name: "あらハート満タンになった",
}, },
"FRESH_START": { "FRESH_START": {
name: "First Try!", name: "一発で!",
description: "Complete the fresh start challenge." description: "出直しチャレンジを クリアする"
} }
} as const; } as const;

View File

@ -1,159 +1,159 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const battle: SimpleTranslationEntries = { export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}}が あらわれた!", "bossAppeared": "{{bossName}}が 現れた!",
"trainerAppeared": "{{trainerName}}が\nしょうぶを しかけてきた!", "trainerAppeared": "{{trainerName}}が\n勝負を しかけてきた!",
"trainerAppearedDouble": "{{trainerName}}が\nしょうぶを しかけてきた!", "trainerAppearedDouble": "{{trainerName}}が\n勝負を しかけてきた!",
"trainerSendOut": "{{trainerName}}は\n{{pokemonName}}を くりだした!", "trainerSendOut": "{{trainerName}}は\n{{pokemonName}}を 繰り出した!",
"singleWildAppeared": "あっ! やせいの\n{{pokemonName}}が とびだしてきた!", "singleWildAppeared": "あっ! 野生の {{pokemonName}}が 飛び出してきた!",
"multiWildAppeared": "あっ! やせいの {{pokemonName1}}と\n{{pokemonName2}}が とびだしてきた!", "multiWildAppeared": "あっ! 野生の {{pokemonName1}}と\n{{pokemonName2}}が 飛び出してきた!",
"playerComeBack": "{{pokemonName}}! もどれ!", "playerComeBack": "{{pokemonName}}! 戻れ!",
"trainerComeBack": "{{trainerName}}は\n{{pokemonName}}を ひっこめた!", "trainerComeBack": "{{trainerName}}は\n{{pokemonName}}を 引っ込めた!",
"playerGo": "ゆけっ! {{pokemonName}}", "playerGo": "ゆけっ! {{pokemonName}}",
"trainerGo": "{{trainerName}}は\n{{pokemonName}}を くりだした!", "trainerGo": "{{trainerName}}は\n{{pokemonName}}を 繰り出した!",
"switchQuestion": "{{pokemonName}}を\nいれかえますか?", "switchQuestion": "{{pokemonName}}を\n入れ替えますか?",
"trainerDefeated": "{{trainerName}}\nとの しょうぶに かった!", "trainerDefeated": "{{trainerName}} との 勝負に 勝った!",
"moneyWon": "しょうきんとして\n₽{{moneyAmount}} てにいれた!", "moneyWon": "賞金として ₽{{moneyAmount}}を 手に入れた!",
"moneyPickedUp": "₽{{moneyAmount}}を ひろった!", "moneyPickedUp": "₽{{moneyAmount}}を った!",
"pokemonCaught": "{{pokemonName}}を\nつかまえたぞ!", "pokemonCaught": "{{pokemonName}}を 捕まえたぞ!",
"addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", "addedAsAStarter": "今から {{pokemonName}}は 最初のパートナーとして 選べられる!",
"partyFull": "てもちがいっぱいです。\n{{pokemonName}}をいれるために ポケモンを ひとり てばなしますか?", "partyFull": "手持ちが いっぱいです。\n{{pokemonName}}を入れる ために ポケモンを 一つ 逃がすか?",
"pokemon": "ポケモン", "pokemon": "ポケモン",
"sendOutPokemon": "がんばれ! {{pokemonName}}", "sendOutPokemon": "頑張れ! {{pokemonName}}",
"hitResultCriticalHit": "きゅうしょに あたった!", "hitResultCriticalHit": "急所に 当たった!",
"hitResultSuperEffective": "こうかは ばつぐんだ!", "hitResultSuperEffective": "効果は バツグンだ!",
"hitResultNotVeryEffective": "こうかは いまひとつの ようだ……", "hitResultNotVeryEffective": "効果は 今ひとつの ようだ……",
"hitResultNoEffect": "{{pokemonName}}には こうかが ないようだ…", "hitResultNoEffect": "{{pokemonName}}には 効果が ないようだ…",
"hitResultOneHitKO": "いちげき ひっさつ", "hitResultOneHitKO": "一撃必殺",
"attackFailed": "しかし うまく きまらなかった!!", "attackFailed": "しかし うまく 決まらなかった!!",
"attackMissed": "{{pokemonNameWithAffix}}にはたらなかった!", "attackMissed": "{{pokemonNameWithAffix}}には 当たらなかった!",
"attackHitsCount": "{{count}}かい たった!", "attackHitsCount": "{{count}}かい たった!",
"rewardGain": "{{modifierName}}を\nてにいれた!", "rewardGain": "{{modifierName}}を 手に入れた!",
"expGain": "{{pokemonName}}は\n{{exp}}けいけんちを もらった!", "expGain": "{{pokemonName}}は\n{{exp}}経験値を もらった!",
"levelUp": "{{pokemonName}}は\nレベル{{level}} に あがった!", "levelUp": "{{pokemonName}}は\nレベル{{level}}に 上がった!",
"learnMove": "{{pokemonName}}は あたらしく\n{{moveName}}を おぼえた!", "learnMove": "{{pokemonName}}は 新しく\n{{moveName}}を 覚えた!",
"learnMovePrompt": "{{pokemonName}}は あたらしく\n{{moveName}}を おぼえたい……", "learnMovePrompt": "{{pokemonName}}は 新しく\n{{moveName}}を 覚えたい……",
"learnMoveLimitReached": "しかし {{pokemonName}}は わざを 4つ\nおぼえるので せいいっぱいだ!", "learnMoveLimitReached": "しかし {{pokemonName}}は 技を 4つ\n覚えるので せいいっぱいだ!",
"learnMoveReplaceQuestion": "{{moveName}}の かわりに\nほかの わざを わすれさせますか?", "learnMoveReplaceQuestion": "{{moveName}}の 代わりに\n他の 技を れさせますか?",
"learnMoveStopTeaching": "それでは…… {{moveName}}を\nおぼえるのを あきらめますか?", "learnMoveStopTeaching": "それでは {{moveName}}を\n覚えるのを 諦めますか?",
"learnMoveNotLearned": "{{pokemonName}}は {{moveName}}を\nおぼえずに おわった!", "learnMoveNotLearned": "{{pokemonName}}は {{moveName}}を\n覚えずに わった!",
"learnMoveForgetQuestion": "どの わざを\nわすれさせたい?", "learnMoveForgetQuestion": "どの 技を\n忘れさせたい?",
"learnMoveForgetSuccess": "{{pokemonName}}は {{moveName}}の\nつかいかたを きれいに わすれた!", "learnMoveForgetSuccess": "{{pokemonName}}は {{moveName}}の\n使い方を きれいに れた!",
"countdownPoof": "@d{32}1 @d{15}2の @d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}ポカン!", "countdownPoof": "@d{32}1 @d{15}2の @d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}ポカン!",
"learnMoveAnd": "そして…", "learnMoveAnd": "そして…",
"levelCapUp": "レベルキャップの\n{{levelCap}}にがった!", "levelCapUp": "レベルキャップの\n{{levelCap}}に 上がった!",
"moveNotImplemented": "{{moveName}}は まだじっそうされておらず、せんたくできません。", "moveNotImplemented": "{{moveName}}は まだ 実装されておらず 選択できません。",
"moveNoPP": "しかし わざの\nのこりポイントが なかった!", "moveNoPP": "しかし 技の\n残りポイントが なかった!",
"moveDisabled": "かなしばりで\n{{moveName}}が せない!", "moveDisabled": "かなしばりで\n{{moveName}}が せない!",
"noPokeballForce": "みえない ちからの せいで\nボールを げられない!", "noPokeballForce": "見えない 力の せいで\nボールが げられない!",
"noPokeballTrainer": "ひとのものを\nとったら どろぼう", "noPokeballTrainer": "人の ものを 取ったら 泥棒",
"noPokeballMulti": "あいての ポケモンが ひとつしか\n いないまえに ボールが つかえない!", "noPokeballMulti": "相手の ポケモンが 一つしか\nいない 前に ボールが 使えない!",
"noPokeballStrong": "あいての ポケモンが つよすぎて つかまえられない!\nまずは よわらせよう!", "noPokeballStrong": "相手の ポケモンが 強すぎて 捕まえられない!\nまずは 弱めよう!",
"noEscapeForce": "みえない ちからの せいで\nにげることが できない!", "noEscapeForce": "見えない 力の せいで\n逃げることが できない!",
"noEscapeTrainer": "ダメだ! しょうぶのさいちゅうに\nあいてに せなかを みせられない!", "noEscapeTrainer": "ダメだ! 勝負の最中に\n相手に 背中を せられない!",
"noEscapePokemon": "{{pokemonName}}の {{moveName}}で {{escapeVerb}}!", "noEscapePokemon": "{{pokemonName}}の {{moveName}}で {{escapeVerb}}!",
"runAwaySuccess": " うまく にげきれた!", "runAwaySuccess": " うまく 逃げ切れた!",
"runAwayCannotEscape": "にげることが できない!", "runAwayCannotEscape": "逃げることが できない!",
"escapeVerbSwitch": "いれかえることが できない", "escapeVerbSwitch": "入れ替えることが できない",
"escapeVerbFlee": "にげることが できない", "escapeVerbFlee": "逃げることが できない",
"notDisabled": "{{pokemonName}}の かなしばりが とけた!\nまた {{moveName}}が つかえられる!", "notDisabled": "{{pokemonName}}の かなしばりが 溶けた!\nまた {{moveName}}が 使えられる!",
"turnEndHpRestore": "{{pokemonName}}の たいりょくが かいふくした!", "turnEndHpRestore": "{{pokemonName}}の 体力が 回復した!",
"hpIsFull": "{{pokemonName}}の\nHPが まんたんだ!", "hpIsFull": "{{pokemonName}}の\n体力が 満タンだ!",
"skipItemQuestion": "ほんとに アイテムを とらない", "skipItemQuestion": "本当に アイテムを 取らずに 進みますか",
"eggHatching": "おや?", "eggHatching": "おや?",
"ivScannerUseQuestion": "{{pokemonName}}を\nこたいちスキャナーで そうさする?", "ivScannerUseQuestion": "{{pokemonName}}を\n個体値スキャナーで 操作しますか?",
"wildPokemonWithAffix": "やせいの {{pokemonName}}", "wildPokemonWithAffix": "野生の {{pokemonName}}",
"foePokemonWithAffix": "あいての {{pokemonName}}", "foePokemonWithAffix": "相手の {{pokemonName}}",
"useMove": "{{pokemonNameWithAffix}}の {{moveName}}", "useMove": "{{pokemonNameWithAffix}}の {{moveName}}",
"drainMessage": "{{pokemonName}}から\nたいりょくを すいとった!", "drainMessage": "{{pokemonName}}から\n体力を 吸い取った!",
"regainHealth": "{{pokemonName}}は\nたいりょくを かいふくした!", "regainHealth": "{{pokemonName}}は\n体力を 回復した!",
"stealEatBerry": "{{pokemonName}}は {{targetName}}の\n{{berryName}}を うばって たべた!", "stealEatBerry": "{{pokemonName}}は {{targetName}}の\n{{berryName}}を うばって 食べた!",
"ppHealBerry": "{{pokemonNameWithAffix}}は {{berryName}}で {{moveName}}のPPを かいふくした!", "ppHealBerry": "{{pokemonNameWithAffix}}は {{berryName}}で {{moveName}}のPPを 回復した!",
"hpHealBerry": "{{pokemonNameWithAffix}}は {{berryName}}で たいりょくを かいふくした!", "hpHealBerry": "{{pokemonNameWithAffix}}は {{berryName}}で 体力を 回復した!",
"fainted": "{{pokemonNameWithAffix}}は たおれた!", "fainted": "{{pokemonNameWithAffix}}は 倒れた!",
"statsAnd": "と ", "statsAnd": "と ",
"stats": "のうりょく", "stats": "能力",
"statRose_one": "{{pokemonNameWithAffix}}の {{stats}}が がった!", "statRose_one": "{{pokemonNameWithAffix}}の {{stats}}が がった!",
"statRose_other": "{{pokemonNameWithAffix}}の {{stats}}が がった!", "statRose_other": "{{pokemonNameWithAffix}}の {{stats}}が がった!",
"statSharplyRose_one": "{{pokemonNameWithAffix}}の {{stats}}が ぐーんと あがった!", "statSharplyRose_one": "{{pokemonNameWithAffix}}の {{stats}}が ぐーんと 上がった!",
"statSharplyRose_other": "{{pokemonNameWithAffix}}の {{stats}}が ぐーんと あがった!", "statSharplyRose_other": "{{pokemonNameWithAffix}}の {{stats}}が ぐーんと 上がった!",
"statRoseDrastically_one": "{{pokemonNameWithAffix}}の {{stats}}が ぐぐーんと あがった!", "statRoseDrastically_one": "{{pokemonNameWithAffix}}の {{stats}}が ぐぐーんと 上がった!",
"statRoseDrastically_other": "{{pokemonNameWithAffix}}の {{stats}}が ぐぐーんと あがった!", "statRoseDrastically_other": "{{pokemonNameWithAffix}}の {{stats}}が ぐぐーんと 上がった!",
"statWontGoAnyHigher_one": "{{pokemonNameWithAffix}}の {{stats}}が もう あがらない!", "statWontGoAnyHigher_one": "{{pokemonNameWithAffix}}の {{stats}}が もう 上がらない!",
"statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}の {{stats}}が もう あがらない!", "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}の {{stats}}が もう 上がらない!",
"statFell_one": "{{pokemonNameWithAffix}}の {{stats}}が さがった!", "statFell_one": "{{pokemonNameWithAffix}}の {{stats}}が 下がった!",
"statFell_other": "{{pokemonNameWithAffix}}の {{stats}}が さがった!", "statFell_other": "{{pokemonNameWithAffix}}の {{stats}}が 下がった!",
"statHarshlyFell_one": "{{pokemonNameWithAffix}}の {{stats}}が がくっと さがった!", "statHarshlyFell_one": "{{pokemonNameWithAffix}}の {{stats}}が がくっと 下がった!",
"statHarshlyFell_other": "{{pokemonNameWithAffix}}の {{stats}}が がくっと さがった!", "statHarshlyFell_other": "{{pokemonNameWithAffix}}の {{stats}}が がくっと 下がった!",
"statSeverelyFell_one": "{{pokemonNameWithAffix}}の {{stats}}が がくーんと さがった!", "statSeverelyFell_one": "{{pokemonNameWithAffix}}の {{stats}}が がくーんと 下がった!",
"statSeverelyFell_other": "{{pokemonNameWithAffix}}の {{stats}}が がくーんと さがった!", "statSeverelyFell_other": "{{pokemonNameWithAffix}}の {{stats}}が がくーんと 下がった!",
"statWontGoAnyLower_one": "{{pokemonNameWithAffix}}の {{stats}}が もう さがらない!", "statWontGoAnyLower_one": "{{pokemonNameWithAffix}}の {{stats}}が もう 下がらない!",
"statWontGoAnyLower_other": "{{pokemonNameWithAffix}}の {{stats}}が もう さがらない!", "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}の {{stats}}が もう 下がらない!",
"transformedIntoType": "{{pokemonName}}は\n{{type}}タイプに へんしんした!", "transformedIntoType": "{{pokemonName}}は\n{{type}}タイプに 変身した!",
"retryBattle": "このせんとうの はじまりから やりなおす", "retryBattle": "このバトルの 始まりから やり直しますか",
"unlockedSomething": "{{unlockedThing}}\nを アンロックした", "unlockedSomething": "{{unlockedThing}}\nを アンロックした",
"congratulations": "おめでとうございます!!", "congratulations": "おめでとうございます!!",
"beatModeFirstTime": "はじめて {{speciesName}}が {{gameMode}}モードを クリアした!\n{{newModifier}}を てにいれた!", "beatModeFirstTime": "初めて {{speciesName}}が {{gameMode}}モードを クリアした!\n{{newModifier}}を 手に入れた!",
"ppReduced": "{{targetName}}の {{moveName}}を {{reduction}}けずった!", "ppReduced": "{{targetName}}の {{moveName}}を {{reduction}}削った!",
"battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}は こうげきの はんどうで うごけない!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}は 攻撃の 反動で 動けない!",
"battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}は もう にげられない!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}は もう 逃げられない!",
"battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}は\n{{moveName}}の こうかが とけた!", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}は\n{{moveName}}の 効果が 解けた!",
"battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}は ひるんで わざが だせない!", "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}は ひるんで 技が出せない!",
"battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}は こんらん した!", "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}は 混乱 した!",
"battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}の こんらんが とけた!", "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}の 混乱が 解けた!",
"battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}は すでに こんらん している!", "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}は すでに 混乱している!",
"battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}は こんらん している!", "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}は 混乱している!",
"battlerTagsConfusedLapseHurtItself": "わけも わからず じぶんを こうげきした!", "battlerTagsConfusedLapseHurtItself": "わけも わからず 自分を 攻撃した!",
"battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}を みちづれに できない!", "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}を みちづれに できない!",
"battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}}は あいてを みちづれに した!", "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}}は 相手を みちづれに した!",
"battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に メロメロに なった!", "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に メロメロに なった!",
"battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}は すでに メロメロだ!", "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}は すでに メロメロだ!",
"battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に メロメロだ!", "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に メロメロだ!",
"battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}}は\nメロメロで わざが せなかった!", "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}}は\nメロメロで わざが せなかった!",
"battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}は メロメロじょうたいが なおった!", "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}は メロメロ状態が 治った!",
"battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}}に たねを うえつけた!", "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}}に 種を 植(う)えつけた!",
"battlerTagsSeededLapse": "やどりぎが {{pokemonNameWithAffix}}の たいりょくを うばう!", "battlerTagsSeededLapse": "やどりぎが {{pokemonNameWithAffix}}の 体力を うばう!",
"battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}は ヘドロえきを すいとった!", "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}は ヘドロえきを 吸い取った!",
"battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}は あくむを みはじめた!", "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}は あくむを 見始めた!",
"battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}は すでに うなされている!", "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}は すでに うなされている!",
"battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}は あくむに うなされている!", "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}は あくむに うなされている!",
"battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}は アンコールをうけた!", "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}は アンコールを 受けた!",
"battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}の アンコールじょうたいが とけた!", "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}の アンコール状態が 解けた!",
"battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}は {{pokemonName}}を\nてだすけする たいせいに はいった!", "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}は {{pokemonName}}を\nてだすけする 体制に った!",
"battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}は ねから\n ようぶんを すいとった!", "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}は 根から\n養分ようぶん 吸い取った!",
"battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}は ねを はった!", "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}は 根を 張った!",
"battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}は みずのリングを まとった!", "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}は 水のリングを まとった!",
"battlerTagsAquaRingLapse": "{{pokemonName}}は {{moveName}}で\nたいりょくを かいふくした!", "battlerTagsAquaRingLapse": "{{pokemonName}}は {{moveName}}で\n体力を 回復した!",
"battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} の ねむけを さそった!", "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} の ねむけを 誘(さそ)った!",
"battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}は {{moveName}}の ダメージを けた!", "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}は {{moveName}}の ダメージを けた!",
"battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に しめつけられた!", "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に 締め付けられた!",
"battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に まきつかれた!", "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に 巻き付かれた!",
"battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}は うずの なかに とじこめられた!", "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}は 渦(うず)の中に 閉じ込められた!",
"battlerTagsClampOnTrap": "{{pokemonName}}は {{sourcePokemonNameWithAffix}}の\nからに はさまれた!", "battlerTagsClampOnTrap": "{{pokemonName}}は {{sourcePokemonNameWithAffix}}の\nからに まれた!",
"battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}は {{moveName}}に らわれた!", "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}は {{moveName}}に らわれた!",
"battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}は マグマの\n うずに とじこめられた!", "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}は マグマの\n うず 閉じ込められた!",
"battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}は トラバサミに らわれた!", "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}は トラバサミに らわれた!",
"battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}は {{pokemonNameWithAffix}}に とじこめられた!", "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}は {{pokemonNameWithAffix}}に 閉じ込められた!",
"battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonNameWithAffix}}に まとわりつかれた!", "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonNameWithAffix}}に まとわりつかれた!",
"battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}は\nまもりの たいせいに はいった!", "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}は\nまもりの 体制に 入った!",
"battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}は\nこうげきから みを まもった!", "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}は\n攻撃から 身を守った!",
"battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}は\nこらえる たいせいに はいった!", "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}は\nこらえる 体制に 入った!",
"battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}は\nこうげきを こらえた!", "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}は\n攻撃を こらえた!",
"battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}は\nこうげきを こらえた!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}は\n攻撃を こらえた!",
"battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}の ほろびのカウントが {{turnCount}}になった!", "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}の ほろびのカウントが {{turnCount}}になった!",
"battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}}は ちゅうもくの まとになった!", "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}}は 注目の 的になった!",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}}は なまけている!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}は 怠(なま)けている!",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}は ちょうしが あがらない!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}は 調子が 上がらない!",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}は ちょうしを とりもどした!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}は 調子を 取り戻した!",
"battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}の {{statName}}が\nあがっている じょうたいに なった!", "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}の {{statName}}が\n上がっている 状態に なった!",
"battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}の {{abilityName}}の こうかが なくなった!", "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}の {{abilityName}}の 効果が なくなった!",
"battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}}は でんじりょくで うかびあがった!", "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}}は 電磁力(でんじりょく)で 浮かび上がった!",
"battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}は でんじりょくが なくなった!", "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}は 電磁力(でんじりょく)が なくなった!",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}は はりきっている!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}は 張り切っている!",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}は おちついた。", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}は 落ち着いた。",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}は しおづけに なった!", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}は しおづけに なった!",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}は {{moveName}}の\n ダメージを けている", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}は {{moveName}}の\n ダメージを けている",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}は じぶんの たいりょくを けずって\n{{pokemonName}}に のろいを かけた!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}は 自分の 体力を 削って\n{{pokemonName}}に のろいを かけた!",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}}は のろわれている!", "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}は のろわれている!",
"battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!" "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!"
} as const; } as const;

View File

@ -1,32 +1,32 @@
import { TranslationEntries } from "#app/interfaces/locales"; import { TranslationEntries } from "#app/interfaces/locales";
export const challenges: TranslationEntries = { export const challenges: TranslationEntries = {
"title": "チャレンジ じょうけん せってい", "title": "チャレンジを 設定",
"illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", "illegalEvolution": "{{pokemon}}は このチャレンジで\n対象外の ポケモンに なってしまった",
"singleGeneration": { "singleGeneration": {
"name": "Mono Gen", "name": "単一世代",
"desc": "You can only use Pokémon from Generation {{gen}}.", "desc": "{{gen}}世代からの ポケモンしか 使えません",
"desc_default": "You can only use Pokémon from the chosen generation.", "desc_default": "選んだ 世代からの ポケモンしか 使えません",
"gen_1": "one", "gen_1": "1",
"gen_2": "two", "gen_2": "2",
"gen_3": "three", "gen_3": "3",
"gen_4": "four", "gen_4": "4",
"gen_5": "five", "gen_5": "5",
"gen_6": "six", "gen_6": "6",
"gen_7": "seven", "gen_7": "7",
"gen_8": "eight", "gen_8": "8",
"gen_9": "nine", "gen_9": "9",
}, },
"singleType": { "singleType": {
"name": "Mono Type", "name": "単一タイプ",
"desc": "You can only use Pokémon with the {{type}} type.", "desc": "{{type}}タイプの ポケモンしか 使えません",
"desc_default": "You can only use Pokémon of the chosen type." "desc_default": "選んだ タイプの ポケモンしか 使えません"
//types in pokemon-info //types in pokemon-info
}, },
"freshStart": { "freshStart": {
"name": "Fresh Start", "name": "出直し",
"desc": "You can only use the original starters, and only as if you had just started pokerogue.", "desc": "ポケローグを 始めた ばかりの ような ままで ゲーム開始の 最初のパートナーしか 使えません",
"value.0": "Off", "value.0": "オフ",
"value.1": "On", "value.1": "オン",
}, },
} as const; } as const;

View File

@ -3,16 +3,31 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const filterBar: SimpleTranslationEntries = { export const filterBar: SimpleTranslationEntries = {
"genFilter": "Gen", "genFilter": "Gen",
"typeFilter": "Type", "typeFilter": "Type",
"caughtFilter": "Caught",
"unlocksFilter": "Unlocks", "unlocksFilter": "Unlocks",
"winFilter": "Win", "miscFilter": "Misc",
"sortFilter": "Sort", "sortFilter": "Sort",
"all": "All", "all": "All",
"normal": "Normal", "normal": "Not Shiny",
"uncaught": "Uncaught", "uncaught": "Uncaught",
"passive": "Passive",
"passiveUnlocked": "Passive Unlocked", "passiveUnlocked": "Passive Unlocked",
"passiveLocked": "Passive Locked", "passiveLocked": "Passive Locked",
"hasWon": "Yes", "costReduction": "Cost Reduction",
"hasNotWon": "No", "costReductionUnlocked": "Cost Reduction Unlocked",
"costReductionLocked": "Cost Reduction Locked",
"favorite": "Favorite",
"isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No",
"ribbon": "Ribbon",
"hasWon": "Ribbon - Yes",
"hasNotWon": "Ribbon - No",
"hiddenAbility": "Hidden Ability",
"hasHiddenAbility": "Hidden Ability - Yes",
"noHiddenAbility": "Hidden Ability - No",
"pokerus": "Pokerus",
"hasPokerus": "Pokerus - Yes",
"noPokerus": "Pokerus - No",
"sortByNumber": "No.", "sortByNumber": "No.",
"sortByCost": "Cost", "sortByCost": "Cost",
"sortByCandies": "Candy Count", "sortByCandies": "Candy Count",

View File

@ -56,6 +56,7 @@ export const moveTriggers: SimpleTranslationEntries = {
"sacrificialFullRestore": "{{pokemonName}}の\nねがいごとが かなった", "sacrificialFullRestore": "{{pokemonName}}の\nねがいごとが かなった",
"invertStats": "{{pokemonName}}の\nのうりょくへんかが ぎゃくてんした", "invertStats": "{{pokemonName}}の\nのうりょくへんかが ぎゃくてんした",
"resetStats": "{{pokemonName}}の\nのうりょくへんかが もとにもどった", "resetStats": "{{pokemonName}}の\nのうりょくへんかが もとにもどった",
"statEliminated": "All stat changes were eliminated!",
"faintCountdown": "{{pokemonName}}は\n{{turnCount}}ターンごに ほろびてしまう!", "faintCountdown": "{{pokemonName}}は\n{{turnCount}}ターンごに ほろびてしまう!",
"copyType": "{{pokemonName}}は {{targetPokemonName}}と\n同じタイプに なった", "copyType": "{{pokemonName}}は {{targetPokemonName}}と\n同じタイプに なった",
"suppressAbilities": "{{pokemonName}}の とくせいが きかなくなった!", "suppressAbilities": "{{pokemonName}}の とくせいが きかなくなった!",

View File

@ -28,6 +28,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"toggleIVs": "個体値を ひょうじ", "toggleIVs": "個体値を ひょうじ",
"manageMoves": "わざを ならびかえ", "manageMoves": "わざを ならびかえ",
"manageNature": "せいかくを ならびかえ", "manageNature": "せいかくを ならびかえ",
"addToFavorites": "Add to Favorites",
"removeFromFavorites": "Remove from Favorites",
"useCandies": "アメを つかう", "useCandies": "アメを つかう",
"selectNature": "せいかくをえらんでください", "selectNature": "せいかくをえらんでください",
"selectMoveSwapOut": "交換する技を選択してください", "selectMoveSwapOut": "交換する技を選択してください",

View File

@ -2,7 +2,7 @@ import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js";
export const statusEffect: StatusEffectTranslationEntries = { export const statusEffect: StatusEffectTranslationEntries = {
none: { none: {
name: "None", name: "なし",
description: "", description: "",
obtain: "", obtain: "",
obtainSource: "", obtainSource: "",
@ -11,57 +11,57 @@ export const statusEffect: StatusEffectTranslationEntries = {
heal: "" heal: ""
}, },
poison: { poison: {
name: "Poison", name: "どく",
description: "poisoning", description: "どく",
obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", obtain: "{{pokemonNameWithAffix}}は\n毒を あびた",
obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by the {{sourceText}}!", obtainSource: "{{pokemonNameWithAffix}}は\n{{sourceText}}で 毒を あびた!",
activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", activation: "{{pokemonNameWithAffix}}は\n毒の ダメージを 受けた",
overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", overlap: "{{pokemonNameWithAffix}}は すでに\n毒を あびている",
heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" heal: "{{pokemonNameWithAffix}}の 毒は\nきれいさっぱり なくなった"
}, },
toxic: { toxic: {
name: "Toxic", name: "もうどく",
description: "poisoning", description: "もうどく",
obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", obtain: "{{pokemonNameWithAffix}}は\n猛毒を あびた",
obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by the {{sourceText}}!", obtainSource: "{{pokemonNameWithAffix}}は\n{{sourceText}}で 猛毒を あびた!",
activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", activation: "{{pokemonNameWithAffix}}は\n毒の ダメージを受けた",
overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", overlap: "{{pokemonNameWithAffix}}は すでに\n毒を あびている",
heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" heal: "{{pokemonNameWithAffix}}の 毒は\nきれいさっぱり なくなった"
}, },
paralysis: { paralysis: {
name: "Paralysis", name: "まひ",
description: "paralysis", description: "まひ",
obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", obtain: "{{pokemonNameWithAffix}}は まひして\n技が でにくくなった",
obtainSource: "{{pokemonNameWithAffix}} was paralyzed by the {{sourceText}}!\nIt may be unable to move!", obtainSource: "{{pokemonNameWithAffix}}は {{sourceText}}で まひして\n技が でにくくなった",
activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", activation: "{{pokemonNameWithAffix}}は\n体が しびれて 動けない",
overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", overlap: "{{pokemonNameWithAffix}}は\nすでに まひしている",
heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" heal: "{{pokemonNameWithAffix}}の\nしびれが とれた"
}, },
sleep: { sleep: {
name: "Sleep", name: "ねむり",
description: "sleep", description: "ねむり",
obtain: "{{pokemonNameWithAffix}}\nfell asleep!", obtain: "{{pokemonNameWithAffix}}は\n眠ってしまった",
obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from the {{sourceText}}!", obtainSource: "{{pokemonNameWithAffix}}は\n{{sourceText}}で 眠ってしまった!",
activation: "{{pokemonNameWithAffix}} is fast asleep.", activation: "{{pokemonNameWithAffix}}は\nぐうぐう 眠っている",
overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", overlap: "{{pokemonNameWithAffix}}は\nすでに 眠っている",
heal: "{{pokemonNameWithAffix}} woke up!" heal: "{{pokemonNameWithAffix}}は\n目を 覚ました"
}, },
freeze: { freeze: {
name: "Freeze", name: "こおり",
description: "freezing", description: "こおり",
obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", obtain: "{{pokemonNameWithAffix}}は\n凍りついた",
obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by the {{sourceText}}!", obtainSource: "{{pokemonNameWithAffix}}は\n{{sourceText}}で 凍りついた!",
activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", activation: "{{pokemonNameWithAffix}}は\n凍ってしまって 動けない",
overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", overlap: "{{pokemonNameWithAffix}}は\nすでに 凍っている",
heal: "{{pokemonNameWithAffix}} was\ndefrosted!" heal: "{{pokemonNameWithAffix}}は\nこおり状態が 治った"
}, },
burn: { burn: {
name: "Burn", name: "やけど",
description: "burn", description: "やけど",
obtain: "{{pokemonNameWithAffix}}\nwas burned!", obtain: "{{pokemonNameWithAffix}}は\nやけどを 負った",
obtainSource: "{{pokemonNameWithAffix}}\nwas burned by the {{sourceText}}!", obtainSource: "{{pokemonNameWithAffix}}は\n{{sourceText}}で やけどを 負った!",
activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", activation: "{{pokemonNameWithAffix}}は\nやけどの ダメージを 受けた",
overlap: "{{pokemonNameWithAffix}} is\nalready burned!", overlap: "{{pokemonNameWithAffix}}は すでに\nやけどを 負っている",
heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" heal: "{{pokemonNameWithAffix}}の\nやけどが 治った"
}, },
} as const; } as const;

View File

@ -2,10 +2,10 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const voucher: SimpleTranslationEntries = { export const voucher: SimpleTranslationEntries = {
"vouchers": "クーポン", "vouchers": "クーポン",
"eggVoucher": "たまごクーポン", "eggVoucher": "タマゴクーポン",
"eggVoucherPlus": "たまごクーポンプラス", "eggVoucherPlus": "タマゴクーポン・プラス",
"eggVoucherPremium": "たまごクーポンプレミアム", "eggVoucherPremium": "タマゴクーポン・プレミアム",
"eggVoucherGold": "たまごクーポンゴールド", "eggVoucherGold": "タマゴクーポン・ゴールド",
"locked": "Locked", "locked": "なし",
"defeatTrainer": "Defeat {{trainerName}}" "defeatTrainer": "{{trainerName}}を 倒す"
} as const; } as const;

View File

@ -13,9 +13,12 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "패시브", "passive": "패시브",
"passiveUnlocked": "패시브 해금", "passiveUnlocked": "패시브 해금",
"passiveLocked": "패시브 잠김", "passiveLocked": "패시브 잠김",
"costReduction": "코스트 줄이기", "costReduction": "코스트 감소",
"costReductionUnlocked": "코스트 절감됨", "costReductionUnlocked": "코스트 감소됨",
"costReductionLocked": "코스트 절감 없음", "costReductionLocked": "코스트 감소 없음",
"favorite": "즐겨찾기",
"isFavorite": "즐겨찾기 등록됨",
"notFavorite": "즐겨찾기 제외됨",
"ribbon": "클리어 여부", "ribbon": "클리어 여부",
"hasWon": "클리어 완료", "hasWon": "클리어 완료",
"hasNotWon": "클리어 안함", "hasNotWon": "클리어 안함",

View File

@ -56,6 +56,7 @@ export const moveTriggers: SimpleTranslationEntries = {
"sacrificialFullRestore": "{{pokemonName}}의\n치유소원이 이루어졌다!", "sacrificialFullRestore": "{{pokemonName}}의\n치유소원이 이루어졌다!",
"invertStats": "{{pokemonName}}[[는]]\n능력 변화가 뒤집혔다!", "invertStats": "{{pokemonName}}[[는]]\n능력 변화가 뒤집혔다!",
"resetStats": "{{pokemonName}}의 모든 상태가\n원래대로 되돌아왔다!", "resetStats": "{{pokemonName}}의 모든 상태가\n원래대로 되돌아왔다!",
"statEliminated": "모든 상태가 원래대로 되돌아왔다!",
"faintCountdown": "{{pokemonName}}[[는]]\n{{turnCount}}턴 후에 쓰러져 버린다!", "faintCountdown": "{{pokemonName}}[[는]]\n{{turnCount}}턴 후에 쓰러져 버린다!",
"copyType": "{{pokemonName}}[[는]]\n{{targetPokemonName}}[[와]] 같은 타입이 되었다!", "copyType": "{{pokemonName}}[[는]]\n{{targetPokemonName}}[[와]] 같은 타입이 되었다!",
"suppressAbilities": "{{pokemonName}}의\n특성이 효과를 발휘하지 못하게 되었다!", "suppressAbilities": "{{pokemonName}}의\n특성이 효과를 발휘하지 못하게 되었다!",

View File

@ -97,5 +97,6 @@ export const settings: SimpleTranslationEntries = {
"controller": "컨트롤러", "controller": "컨트롤러",
"gamepadSupport": "게임패드 지원", "gamepadSupport": "게임패드 지원",
"showBgmBar": "BGM 제목 보여주기", "showBgmBar": "BGM 제목 보여주기",
"moveTouchControls": "터치 컨트롤 이동",
"shopOverlayOpacity": "상점 오버레이 투명도" "shopOverlayOpacity": "상점 오버레이 투명도"
} as const; } as const;

Some files were not shown because too many files have changed in this diff Show More