Compare commits

...

5 Commits

Author SHA1 Message Date
notpatchmaybe
ea459826d0
Heart Swap implementation. (#712)
* Heart Swap implementation.

 Simply switches the values in 3 arrays.

* Fixed missing space

* Removed some lines.

Removed a for loop.

* Removed an unneccesary line

* TSDoc commentation added

* Changed message method to be more descriptive

* Adjusted message line to be consistent with Pokemon Showdown

* Adjusted priorBoostArray to priorBoost integer

Only one values is relevant at a time, so the array was pointless, woops.
2024-05-11 09:42:57 -05:00
William Burleson
8707213e88
Adds session playtime to gameInfo for Rich Presence (#738)
* Add rich presence support

* Adds playtime to gameInfo
2024-05-11 10:11:00 -04:00
Flashfyre
60f86c85ce Fix Glimmora atlases 2024-05-11 09:26:57 -04:00
Somod1
cd9e066524 update 2024-05-11 09:25:02 -04:00
Benjamin Odom
ae7c1ef4f0
Fix Charge Move Infinites (#741)
Fixed an issue where two turn charge moves could be paused by status or Truant causing some infinite sequences if not careful.
2024-05-11 23:22:26 +10:00
17 changed files with 4513 additions and 9305 deletions

File diff suppressed because it is too large Load Diff

View File

@ -4,30 +4,408 @@
"image": "970.png", "image": "970.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 294, "w": 296,
"h": 294 "h": 296
}, },
"scale": 1, "scale": 1,
"frames": [ "frames": [
{ {
"filename": "0001.png", "filename": "0007.png",
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"sourceSize": { "sourceSize": {
"w": 294, "w": 61,
"h": 272 "h": 77
}, },
"spriteSourceSize": { "spriteSourceSize": {
"x": 0, "x": 2,
"y": 0, "y": 8,
"w": 294, "w": 59,
"h": 272 "h": 60
}, },
"frame": { "frame": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 294, "w": 59,
"h": 272 "h": 60
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 2,
"y": 8,
"w": 59,
"h": 60
},
"frame": {
"x": 59,
"y": 0,
"w": 59,
"h": 60
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 6,
"w": 59,
"h": 62
},
"frame": {
"x": 118,
"y": 0,
"w": 59,
"h": 62
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 5,
"w": 58,
"h": 63
},
"frame": {
"x": 177,
"y": 0,
"w": 58,
"h": 63
}
},
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 2,
"y": 5,
"w": 59,
"h": 66
},
"frame": {
"x": 235,
"y": 0,
"w": 59,
"h": 66
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 1,
"y": 4,
"w": 60,
"h": 66
},
"frame": {
"x": 0,
"y": 60,
"w": 60,
"h": 66
}
},
{
"filename": "0018.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 4,
"w": 59,
"h": 66
},
"frame": {
"x": 60,
"y": 62,
"w": 59,
"h": 66
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 59,
"h": 67
},
"frame": {
"x": 119,
"y": 63,
"w": 59,
"h": 67
}
},
{
"filename": "0017.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 59,
"h": 67
},
"frame": {
"x": 178,
"y": 66,
"w": 59,
"h": 67
}
},
{
"filename": "0012.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 4,
"w": 59,
"h": 68
},
"frame": {
"x": 237,
"y": 66,
"w": 59,
"h": 68
}
},
{
"filename": "0015.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 4,
"w": 59,
"h": 68
},
"frame": {
"x": 0,
"y": 126,
"w": 59,
"h": 68
}
},
{
"filename": "0014.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 1,
"y": 1,
"w": 60,
"h": 69
},
"frame": {
"x": 59,
"y": 128,
"w": 60,
"h": 69
}
},
{
"filename": "0001.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 61,
"h": 69
},
"frame": {
"x": 119,
"y": 133,
"w": 61,
"h": 69
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 61,
"h": 69
},
"frame": {
"x": 119,
"y": 133,
"w": 61,
"h": 69
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 3,
"w": 61,
"h": 69
},
"frame": {
"x": 180,
"y": 134,
"w": 61,
"h": 69
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 61,
"h": 69
},
"frame": {
"x": 0,
"y": 197,
"w": 61,
"h": 69
}
},
{
"filename": "0019.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 61,
"h": 69
},
"frame": {
"x": 61,
"y": 202,
"w": 61,
"h": 69
}
},
{
"filename": "0013.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 61,
"h": 71
},
"frame": {
"x": 122,
"y": 203,
"w": 61,
"h": 71
}
},
{
"filename": "0016.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 61,
"h": 71
},
"frame": {
"x": 183,
"y": 203,
"w": 61,
"h": 71
} }
} }
] ]
@ -36,6 +414,6 @@
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "3.0", "version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:eb082214aae3ead48b7392bfc2701b0e:1b1153da7ce39a79125cb8a7c87e1cf3:51b1ef671985c954e537f39ec6f4e095$" "smartupdate": "$TexturePacker:SmartUpdate:826f0c54b74572cfb274b9973fbd50bf:a0d3e34e9b94dc843d98c54879e0c70e:97e320d73d4227f4b083688478fb20b2$"
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1971,6 +1971,7 @@ export default class BattleScene extends SceneBase {
updateGameInfo(): void { updateGameInfo(): void {
const gameInfo = { const gameInfo = {
playTime: this.sessionPlayTime ? this.sessionPlayTime : 0,
gameMode: this.currentBattle ? this.gameMode.getName() : 'Title', gameMode: this.currentBattle ? this.gameMode.getName() : 'Title',
biome: this.currentBattle ? getBiomeName(this.arena.biomeType) : '', biome: this.currentBattle ? getBiomeName(this.arena.biomeType) : '',
wave: this.currentBattle?.waveIndex || 0, wave: this.currentBattle?.waveIndex || 0,

View File

@ -1775,6 +1775,37 @@ export class ResetStatsAttr extends MoveEffectAttr {
} }
} }
/**
* Attribute used for moves which swap the user and the target's stat changes.
*/
export class SwapStatsAttr extends MoveEffectAttr
{
/**
* Swaps the user and the target's stat changes.
* @param user Pokemon that used the move
* @param target The target of the move
* @param move Move with this attribute
* @param args N/A
* @returns true if the function succeeds
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any []): boolean
{
if (!super.apply(user, target, move, args))
return false; //Exits if the move can't apply
let priorBoost : integer; //For storing a stat boost
for (let s = 0; s < target.summonData.battleStats.length; s++)
{
priorBoost = user.summonData.battleStats[s]; //Store user stat boost
user.summonData.battleStats[s] = target.summonData.battleStats[s]; //Applies target boost to self
target.summonData.battleStats[s] = priorBoost; //Applies stored boost to target
}
target.updateInfo();
user.updateInfo();
target.scene.queueMessage(getPokemonMessage(user, ' switched stat changes with the target!'));
return true;
}
}
export class HpSplitAttr extends MoveEffectAttr { export class HpSplitAttr extends MoveEffectAttr {
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 => {
@ -5181,7 +5212,7 @@ export function initMoves() {
.attr(AddArenaTrapTagAttr, ArenaTagType.TOXIC_SPIKES) .attr(AddArenaTrapTagAttr, ArenaTagType.TOXIC_SPIKES)
.target(MoveTarget.ENEMY_SIDE), .target(MoveTarget.ENEMY_SIDE),
new StatusMove(Moves.HEART_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 4) new StatusMove(Moves.HEART_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 4)
.unimplemented(), .attr(SwapStatsAttr),
new SelfStatusMove(Moves.AQUA_RING, Type.WATER, -1, 20, -1, 0, 4) new SelfStatusMove(Moves.AQUA_RING, Type.WATER, -1, 20, -1, 0, 4)
.attr(AddBattlerTagAttr, BattlerTagType.AQUA_RING, true, true), .attr(AddBattlerTagAttr, BattlerTagType.AQUA_RING, true, true),
new SelfStatusMove(Moves.MAGNET_RISE, Type.ELECTRIC, -1, 10, -1, 0, 4) new SelfStatusMove(Moves.MAGNET_RISE, Type.ELECTRIC, -1, 10, -1, 0, 4)

View File

@ -731,7 +731,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const overrideArray: Array<Moves> = this.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.OPP_MOVESET_OVERRIDE; const overrideArray: Array<Moves> = this.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.OPP_MOVESET_OVERRIDE;
if (overrideArray.length > 0) { if (overrideArray.length > 0) {
overrideArray.forEach((move: Moves, index: number) => { overrideArray.forEach((move: Moves, index: number) => {
const ppUsed = this.moveset[index]?.ppUp || 0; const ppUsed = this.moveset[index]?.ppUsed || 0;
this.moveset[index] = new PokemonMove(move, Math.min(ppUsed, allMoves[move].pp)) this.moveset[index] = new PokemonMove(move, Math.min(ppUsed, allMoves[move].pp))
}); });
} }

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,7 @@ export const battle: SimpleTranslationEntries = {
"noPokeballForce": "一股无形的力量阻止了你使用精灵球。", "noPokeballForce": "一股无形的力量阻止了你使用精灵球。",
"noPokeballTrainer": "你不能捕捉其他训练家的宝可梦!", "noPokeballTrainer": "你不能捕捉其他训练家的宝可梦!",
"noPokeballMulti": "只能在剩下一只宝可梦时才能扔出精灵球!", "noPokeballMulti": "只能在剩下一只宝可梦时才能扔出精灵球!",
"noPokeballStrong": "目标宝可梦太强了,无法捕捉!你需要先削弱它!", "noPokeballStrong": "目标宝可梦太强了,无法捕捉!你需要先\n削弱它!",
"noEscapeForce": "一股无形的力量阻止你逃跑。", "noEscapeForce": "一股无形的力量阻止你逃跑。",
"noEscapeTrainer": "你不能从训练家战斗中逃跑!", "noEscapeTrainer": "你不能从训练家战斗中逃跑!",
"noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}", "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}",

View File

@ -6,7 +6,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
"STATS": "数据统计", "STATS": "数据统计",
"VOUCHERS": "兑换券", "VOUCHERS": "兑换券",
"EGG_LIST": "蛋列表", "EGG_LIST": "蛋列表",
"EGG_GACHA": "扭蛋", "EGG_GACHA": "扭蛋",
"MANAGE_DATA": "管理数据", "MANAGE_DATA": "管理数据",
"COMMUNITY": "社区", "COMMUNITY": "社区",
"RETURN_TO_TITLE": "返回标题画面", "RETURN_TO_TITLE": "返回标题画面",
@ -19,5 +19,5 @@ export const menuUiHandler: SimpleTranslationEntries = {
"importData": "导入数据", "importData": "导入数据",
"exportData": "导出数据", "exportData": "导出数据",
"cancel": "取消", "cancel": "取消",
"losingProgressionWarning": "你将失去自战斗开始以来的所有进度。是否继续?" "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。是否\n继续?"
} as const; } as const;

View File

@ -29,7 +29,7 @@ export const menu: SimpleTranslationEntries = {
"confirmPassword": "确认密码", "confirmPassword": "确认密码",
"registrationAgeWarning": "注册即表示您确认您已年满 13 岁。", "registrationAgeWarning": "注册即表示您确认您已年满 13 岁。",
"backToLogin": "返回登录", "backToLogin": "返回登录",
"failedToLoadSaveData": "读取存档数据失败。请重新加载页面。如果问题仍然存在,请联系管理员。", "failedToLoadSaveData": "读取存档数据失败。请重新加载页面。如果\n问题仍然存在,请联系管理员。",
"sessionSuccess": "会话加载成功。", "sessionSuccess": "会话加载成功。",
"failedToLoadSession": "无法加载您的会话数据。它可能已损坏。", "failedToLoadSession": "无法加载您的会话数据。它可能已损坏。",
"boyOrGirl": "你是男孩还是女孩?", "boyOrGirl": "你是男孩还是女孩?",

File diff suppressed because it is too large Load Diff

View File

@ -57,7 +57,7 @@ export const pokemon: SimpleTranslationEntries = {
"psyduck": "可达鸭", "psyduck": "可达鸭",
"golduck": "哥达鸭", "golduck": "哥达鸭",
"mankey": "猴怪", "mankey": "猴怪",
"primeape": "火猴", "primeape": "火猴",
"growlithe": "卡蒂狗", "growlithe": "卡蒂狗",
"arcanine": "风速狗", "arcanine": "风速狗",
"poliwag": "蚊香蝌蚪", "poliwag": "蚊香蝌蚪",
@ -233,7 +233,7 @@ export const pokemon: SimpleTranslationEntries = {
"kingdra": "刺龙王", "kingdra": "刺龙王",
"phanpy": "小小象", "phanpy": "小小象",
"donphan": "顿甲", "donphan": "顿甲",
"porygon2": "多边兽", "porygon2": "多边兽2型",
"stantler": "惊角鹿", "stantler": "惊角鹿",
"smeargle": "图图犬", "smeargle": "图图犬",
"tyrogue": "无畏小子", "tyrogue": "无畏小子",
@ -474,7 +474,7 @@ export const pokemon: SimpleTranslationEntries = {
"glaceon": "冰伊布", "glaceon": "冰伊布",
"gliscor": "天蝎王", "gliscor": "天蝎王",
"mamoswine": "象牙猪", "mamoswine": "象牙猪",
"porygon_z": "多边兽", "porygon_z": "多边兽乙型",
"gallade": "艾路雷朵", "gallade": "艾路雷朵",
"probopass": "大朝北鼻", "probopass": "大朝北鼻",
"dusknoir": "黑夜魔灵", "dusknoir": "黑夜魔灵",
@ -563,7 +563,7 @@ export const pokemon: SimpleTranslationEntries = {
"scrafty": "头巾混混", "scrafty": "头巾混混",
"sigilyph": "象征鸟", "sigilyph": "象征鸟",
"yamask": "哭哭面具", "yamask": "哭哭面具",
"cofagrigus": "死神棺", "cofagrigus": "迭失棺",
"tirtouga": "原盖海龟", "tirtouga": "原盖海龟",
"carracosta": "肋骨海龟", "carracosta": "肋骨海龟",
"archen": "始祖小鸟", "archen": "始祖小鸟",
@ -594,7 +594,7 @@ export const pokemon: SimpleTranslationEntries = {
"amoonguss": "败露球菇", "amoonguss": "败露球菇",
"frillish": "轻飘飘", "frillish": "轻飘飘",
"jellicent": "胖嘟嘟", "jellicent": "胖嘟嘟",
"alomomola": "保曼波", "alomomola": "保曼波",
"joltik": "电电虫", "joltik": "电电虫",
"galvantula": "电蜘蛛", "galvantula": "电蜘蛛",
"ferroseed": "种子铁球", "ferroseed": "种子铁球",
@ -675,7 +675,7 @@ export const pokemon: SimpleTranslationEntries = {
"skiddo": "坐骑小羊", "skiddo": "坐骑小羊",
"gogoat": "坐骑山羊", "gogoat": "坐骑山羊",
"pancham": "顽皮熊猫", "pancham": "顽皮熊猫",
"pangoro": "流氓熊猫", "pangoro": "霸道熊猫",
"furfrou": "多丽米亚", "furfrou": "多丽米亚",
"espurr": "妙喵", "espurr": "妙喵",
"meowstic": "超能妙喵", "meowstic": "超能妙喵",
@ -760,7 +760,7 @@ export const pokemon: SimpleTranslationEntries = {
"salandit": "夜盗火蜥", "salandit": "夜盗火蜥",
"salazzle": "焰后蜥", "salazzle": "焰后蜥",
"stufful": "童偶熊", "stufful": "童偶熊",
"bewear": "穿熊", "bewear": "穿熊",
"bounsweet": "甜竹竹", "bounsweet": "甜竹竹",
"steenee": "甜舞妮", "steenee": "甜舞妮",
"tsareena": "甜冷美后", "tsareena": "甜冷美后",
@ -778,7 +778,7 @@ export const pokemon: SimpleTranslationEntries = {
"komala": "树枕尾熊", "komala": "树枕尾熊",
"turtonator": "爆焰龟兽", "turtonator": "爆焰龟兽",
"togedemaru": "托戈德玛尔", "togedemaru": "托戈德玛尔",
"mimikyu": "谜拟", "mimikyu": "谜拟",
"bruxish": "磨牙彩皮鱼", "bruxish": "磨牙彩皮鱼",
"drampa": "老翁龙", "drampa": "老翁龙",
"dhelmise": "破破舵轮", "dhelmise": "破破舵轮",
@ -827,8 +827,8 @@ export const pokemon: SimpleTranslationEntries = {
"blipbug": "索侦虫", "blipbug": "索侦虫",
"dottler": "天罩虫", "dottler": "天罩虫",
"orbeetle": "以欧路普", "orbeetle": "以欧路普",
"nickit": "偷儿狐", "nickit": "狡小狐",
"thievul": "狐大盗", "thievul": "猾大狐",
"gossifleur": "幼棉棉", "gossifleur": "幼棉棉",
"eldegoss": "白蓬蓬", "eldegoss": "白蓬蓬",
"wooloo": "毛辫羊", "wooloo": "毛辫羊",
@ -848,7 +848,7 @@ export const pokemon: SimpleTranslationEntries = {
"cramorant": "古月鸟", "cramorant": "古月鸟",
"arrokuda": "刺梭鱼", "arrokuda": "刺梭鱼",
"barraskewda": "戽斗尖梭", "barraskewda": "戽斗尖梭",
"toxel": "电婴", "toxel": "婴",
"toxtricity": "颤弦蝾螈", "toxtricity": "颤弦蝾螈",
"sizzlipede": "烧火蚣", "sizzlipede": "烧火蚣",
"centiskorch": "焚焰蚣", "centiskorch": "焚焰蚣",
@ -867,7 +867,7 @@ export const pokemon: SimpleTranslationEntries = {
"cursola": "魔灵珊瑚", "cursola": "魔灵珊瑚",
"sirfetchd": "葱游兵", "sirfetchd": "葱游兵",
"mr_rime": "踏冰人偶", "mr_rime": "踏冰人偶",
"runerigus": "死神板", "runerigus": "迭失板",
"milcery": "小仙奶", "milcery": "小仙奶",
"alcremie": "霜奶仙", "alcremie": "霜奶仙",
"falinks": "列阵兵", "falinks": "列阵兵",
@ -1026,61 +1026,61 @@ export const pokemon: SimpleTranslationEntries = {
"iron_crown": "铁头壳", "iron_crown": "铁头壳",
"terapagos": "太乐巴戈斯", "terapagos": "太乐巴戈斯",
"pecharunt": "桃歹郎", "pecharunt": "桃歹郎",
"alola_rattata": "阿罗拉拉达", "alola_rattata": "拉达",
"alola_raticate": "阿罗拉拉达", "alola_raticate": "拉达",
"alola_raichu": "阿罗拉雷丘", "alola_raichu": "雷丘",
"alola_sandshrew": "阿罗拉穿山鼠", "alola_sandshrew": "穿山鼠",
"alola_sandslash": "阿罗拉穿山王", "alola_sandslash": "穿山王",
"alola_vulpix": "阿罗拉六尾", "alola_vulpix": "六尾",
"alola_ninetales": "阿罗拉九尾", "alola_ninetales": "九尾",
"alola_diglett": "阿罗拉地鼠", "alola_diglett": "地鼠",
"alola_dugtrio": "阿罗拉三地鼠", "alola_dugtrio": "三地鼠",
"alola_meowth": "阿罗拉喵喵", "alola_meowth": "喵喵",
"alola_persian": "阿罗拉猫老大", "alola_persian": "猫老大",
"alola_geodude": "阿罗拉小拳石", "alola_geodude": "小拳石",
"alola_graveler": "阿罗拉隆隆石", "alola_graveler": "隆隆石",
"alola_golem": "阿罗拉隆隆岩", "alola_golem": "隆隆岩",
"alola_grimer": "阿罗拉臭泥", "alola_grimer": "臭泥",
"alola_muk": "阿罗拉臭臭泥", "alola_muk": "臭臭泥",
"alola_exeggutor": "阿罗拉椰蛋树", "alola_exeggutor": "椰蛋树",
"alola_marowak": "阿罗拉嘎啦嘎啦", "alola_marowak": "嘎啦嘎啦",
"eternal_floette": "永恒之花花叶蒂", "eternal_floette": "花叶蒂",
"galar_meowth": "伽勒尔喵喵", "galar_meowth": "喵喵",
"galar_ponyta": "伽勒尔小火马", "galar_ponyta": "小火马",
"galar_rapidash": "伽勒尔烈焰马", "galar_rapidash": "烈焰马",
"galar_slowpoke": "伽勒尔呆呆兽", "galar_slowpoke": "呆呆兽",
"galar_slowbro": "伽勒尔呆壳兽", "galar_slowbro": "呆壳兽",
"galar_farfetchd": "伽勒尔大葱鸭", "galar_farfetchd": "大葱鸭",
"galar_weezing": "伽勒尔双弹瓦斯", "galar_weezing": "双弹瓦斯",
"galar_mr_mime": "伽勒尔魔墙人偶", "galar_mr_mime": "魔墙人偶",
"galar_articuno": "伽勒尔急冻鸟", "galar_articuno": "急冻鸟",
"galar_zapdos": "伽勒尔闪电鸟", "galar_zapdos": "闪电鸟",
"galar_moltres": "伽勒尔火焰鸟", "galar_moltres": "火焰鸟",
"galar_slowking": "伽勒尔呆呆王", "galar_slowking": "呆呆王",
"galar_corsola": "伽勒尔太阳珊瑚", "galar_corsola": "太阳珊瑚",
"galar_zigzagoon": "伽勒尔蛇纹熊", "galar_zigzagoon": "蛇纹熊",
"galar_linoone": "伽勒尔直冲熊", "galar_linoone": "直冲熊",
"galar_darumaka": "伽勒尔火红不倒翁", "galar_darumaka": "火红不倒翁",
"galar_darmanitan": "伽勒尔达摩狒狒", "galar_darmanitan": "达摩狒狒",
"galar_yamask": "伽勒尔哭哭面具", "galar_yamask": "哭哭面具",
"galar_stunfisk": "伽勒尔泥巴鱼", "galar_stunfisk": "泥巴鱼",
"hisui_growlithe": "洗翠卡蒂狗", "hisui_growlithe": "卡蒂狗",
"hisui_arcanine": "洗翠风速狗", "hisui_arcanine": "风速狗",
"hisui_voltorb": "洗翠霹雳电球", "hisui_voltorb": "霹雳电球",
"hisui_electrode": "洗翠顽皮雷弹", "hisui_electrode": "顽皮雷弹",
"hisui_typhlosion": "洗翠火暴兽", "hisui_typhlosion": "火暴兽",
"hisui_qwilfish": "洗翠千针鱼", "hisui_qwilfish": "千针鱼",
"hisui_sneasel": "洗翠狃拉", "hisui_sneasel": "狃拉",
"hisui_samurott": "洗翠大剑鬼", "hisui_samurott": "大剑鬼",
"hisui_lilligant": "洗翠裙儿小姐", "hisui_lilligant": "裙儿小姐",
"hisui_zorua": "洗翠索罗亚", "hisui_zorua": "索罗亚",
"hisui_zoroark": "洗翠索罗亚克", "hisui_zoroark": "索罗亚克",
"hisui_braviary": "洗翠勇士雄鹰", "hisui_braviary": "勇士雄鹰",
"hisui_sliggoo": "洗翠黏美儿", "hisui_sliggoo": "黏美儿",
"hisui_goodra": "洗翠黏美龙", "hisui_goodra": "黏美龙",
"hisui_avalugg": "洗翠冰岩怪", "hisui_avalugg": "冰岩怪",
"hisui_decidueye": "洗翠狙射树枭", "hisui_decidueye": "狙射树枭",
"paldea_tauros": "帕底亚肯泰罗", "paldea_tauros": "肯泰罗",
"paldea_wooper": "帕底亚乌波", "paldea_wooper": "乌波",
"bloodmoon_ursaluna": "血月月月熊", "bloodmoon_ursaluna": "月月熊",
} as const; } as const;

View File

@ -2,41 +2,43 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const tutorial: SimpleTranslationEntries = { export const tutorial: SimpleTranslationEntries = {
"intro": `欢迎来到PokéRogue这是一款以战斗为核心的融合了roguelite元素的宝可梦同人游戏。 "intro": `欢迎来到PokéRogue这是一款以战斗为核心的融合了roguelite元素的宝可梦同人游戏。
$本游戏未进行商业化Pokémon或Pokémon使用的版权资产的所有权 $本游戏未进行商业化\nPokémon或Pokémon使用的版
$游戏仍在开发中\n如需报告错误使 Discord $权资产的所有权
$如果游戏运行缓慢`, $游戏仍在开发中\n告错误使 Discord
$如果游戏运行缓慢\n打开了`,
"accessMenu": `在等待输入时,按 M 或 Escape 键可访问菜单。\n菜单包含设置和各种功能。`, "accessMenu": `在等待输入时,按 M 或 Escape 键可访\n问菜单。菜单包含设置和各种功能。`,
"menu": `在此菜单中,您可以访问设置。 "menu": `在此菜单中,您可以访问设置。
$在设置中 $在设置中\n和其他选
$这里还有各种其他功能`, $这里还有各种其他功能`,
"starterSelect": `在此页面中,您可以选择您的初始宝可梦。\n这些是您最初的队伍成员。 "starterSelect": `在此页面中,您可以选择您的初始宝可梦。\n这些是您最初的队伍成员。
$每个初始宝可梦都有一个费用\n6 10 $每个初始宝可梦都有一个费用\n最多可以拥有6名成员10
$您还可以根据\n您捕获或孵化的变种选择性别 $您还可以根据您捕获或孵化的变种选择性别\n
$一个物种个体值是您捕获或孵化的所有宝可梦中最好的`, $一个物种个体值是您捕获或孵化的所有宝可\n梦中最好的`,
"pokerus": `每天随机 3 个可选的初始宝可梦会有紫色边框。 "pokerus": `每天随机3个可选的初始宝可梦会有紫色边\n框。
$如果您看到您拥有的初始宝可梦带有紫色边框\n请尝试将其添加到您的队伍中`, $如果您看到您拥有的初始宝可梦带有紫色边\n框
$查看其概况`,
"statChange": `只要您的宝可梦没有被召回,属性变化就会在战斗中持续存在。 "statChange": `只要您的宝可梦没有被召回,属性变化就会\n在战斗中持续存在。
$在训练家战斗之前和进入新的宝可梦群落之 $在训练家战斗之前和进入新的宝可梦群落之\n
$您还可以通过按住 C Shift `, $您还可以通过按住C或Shift键来查看\n场上宝可梦的能力变`,
"selectItem": `每次战斗后,您都可以选择 3 个随机物品。\n您只能选择其中一个。 "selectItem": `每次战斗后,您都可以选择 3 个随机物品。\n您只能选择其中一个。
$这些物品包括消耗品 $这些物品包括消耗品\n久被动道
$大多数非消耗品的效果会以各种方式叠加 $大多数非消耗品的效果会以各种方式叠加
$某些物品只有在可以使用时才会出现 $某些物品只有在可以使用时才会出现\n进化物
$您还可以使用转移选项在宝可梦之间转移携带物品 $您还可以使用转移选项在宝可梦之间转移携\n带物品
$一旦您获得了携带物品 $一旦您获得了携带物品\n在右下
$您可以用金钱购买消耗品 $您可以用金钱购买消耗品\n的深
$请务必在选择随机物品之前购买这些消耗品`, $请务必在选择随机物品之前购买这些消耗品\n因为一旦您选`,
"eggGacha": `在此页面中,您可以使用您的兑换券兑换\n可梦蛋。 "eggGacha": `在此页面中,您可以使用您的兑换券兑换\n可梦蛋。
$蛋需要孵化 $蛋需要孵化\n化周
$孵化的宝可梦不会被添加到您的队伍中 $孵化的宝可梦不会被添加到您的队伍中\n们将被添加到您的初始宝可梦
$从蛋中孵化的宝可梦通常比\n野生宝可梦具有更好的个体值 $从蛋中孵化的宝可梦通常比野生宝可梦具有\n更好的个体值
$有些宝可梦只能从蛋中获得 $有些宝可梦只能从蛋中获得
$有 3 \n奖励`, $有 3 \n都有不同的奖励`,
} as const; } as const;

View File

@ -2211,22 +2211,22 @@ export class MovePhase extends BattlePhase {
} }
// Move redirection abilities (ie. Storm Drain) only support single target moves // Move redirection abilities (ie. Storm Drain) only support single target moves
const moveTarget = this.targets.length === 1 const moveTarget = this.targets.length === 1
? new Utils.IntegerHolder(this.targets[0]) ? new Utils.IntegerHolder(this.targets[0])
: null; : null;
if (moveTarget) { if (moveTarget) {
var oldTarget = moveTarget.value; var oldTarget = moveTarget.value;
this.scene.getField(true).filter(p => p !== this.pokemon).forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, this.move.moveId, moveTarget)); this.scene.getField(true).filter(p => p !== this.pokemon).forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, this.move.moveId, moveTarget));
//Check if this move is immune to being redirected, and restore its target to the intended target if it is. //Check if this move is immune to being redirected, and restore its target to the intended target if it is.
if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) || this.move.getMove().getAttrs(BypassRedirectAttr).length)) { if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) || this.move.getMove().getAttrs(BypassRedirectAttr).length)) {
//If an ability prevented this move from being redirected, display its ability pop up. //If an ability prevented this move from being redirected, display its ability pop up.
if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) && !this.move.getMove().getAttrs(BypassRedirectAttr).length) && oldTarget != moveTarget.value) { if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) && !this.move.getMove().getAttrs(BypassRedirectAttr).length) && oldTarget != moveTarget.value) {
this.scene.unshiftPhase(new ShowAbilityPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getPassiveAbility().hasAttr(BlockRedirectAbAttr))); this.scene.unshiftPhase(new ShowAbilityPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getPassiveAbility().hasAttr(BlockRedirectAbAttr)));
} }
moveTarget.value = oldTarget; moveTarget.value = oldTarget;
} }
this.targets[0] = moveTarget.value; this.targets[0] = moveTarget.value;
} }
if (this.targets.length === 1 && this.targets[0] === BattlerIndex.ATTACKER) { if (this.targets.length === 1 && this.targets[0] === BattlerIndex.ATTACKER) {
if (this.pokemon.turnData.attacksReceived.length) { if (this.pokemon.turnData.attacksReceived.length) {
@ -2269,16 +2269,20 @@ const moveTarget = this.targets.length === 1
if (!this.followUp && this.canMove() && !this.cancelled) { if (!this.followUp && this.canMove() && !this.cancelled) {
this.pokemon.lapseTags(BattlerTagLapseType.MOVE); this.pokemon.lapseTags(BattlerTagLapseType.MOVE);
} }
const moveQueue = this.pokemon.getMoveQueue();
if (this.cancelled || this.failed) { if (this.cancelled || this.failed) {
if (this.failed) if (this.failed)
this.move.usePp(ppUsed); // Only use PP if the move failed this.move.usePp(ppUsed); // Only use PP if the move failed
// Record a failed move so Abilities like Truant don't trigger next turn and soft-lock
this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL });
this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); // Remove any tags from moves like Fly/Dive/etc.
moveQueue.shift(); // Remove the second turn of charge moves
return this.end(); return this.end();
} }
const moveQueue = this.pokemon.getMoveQueue();
this.scene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangePreMoveTrigger); this.scene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangePreMoveTrigger);
if (this.move.moveId) if (this.move.moveId)