diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 8e7606f0a48..79ab1bdc38a 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -4,4 +4,19 @@
* @pagefaultgames/junior-dev-team
# github actions/templates etc. - Dev Leads
-/.github @pagefaultgames/dev-leads
+/.github @pagefaultgames/senior-dev-team
+
+# Art Team
+/public/**/*.png @pagefaultgames/art-team
+/public/**/*.json @pagefaultgames/art-team
+/public/images @pagefaultgames/art-team
+/public/battle-anims @pagefaultgames/art-team
+
+# Audio files
+*.mp3 @pagefaultgames/composer-team
+*.wav @pagefaultgames/composer-team
+*.ogg @pagefaultgames/composer-team
+/public/audio @pagefaultgames/composer-team
+
+# Balance Files; contain actual code logic and must also be owned by dev team
+/src/data/balance @pagefaultgames/balance-team @pagefaultgames/junior-dev-team
\ No newline at end of file
diff --git a/index.html b/index.html
index 91367cf73ec..111464b5e5c 100644
--- a/index.html
+++ b/index.html
@@ -133,7 +133,7 @@
V
-
+
V
diff --git a/package-lock.json b/package-lock.json
index 739ce18496d..453a525581b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "pokemon-rogue-battle",
- "version": "1.7.0",
+ "version": "1.7.6",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "pokemon-rogue-battle",
- "version": "1.7.0",
+ "version": "1.7.6",
"hasInstallScript": true,
"dependencies": {
"@material/material-color-utilities": "^0.2.7",
diff --git a/package.json b/package.json
index 5a191b3ec99..4c9204f60f9 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "pokemon-rogue-battle",
"private": true,
- "version": "1.7.0",
+ "version": "1.7.6",
"type": "module",
"scripts": {
"start": "vite",
diff --git a/public/images/events/pkmnday2025event-de.png b/public/images/events/pkmnday2025event-de.png
new file mode 100644
index 00000000000..4cc53546752
Binary files /dev/null and b/public/images/events/pkmnday2025event-de.png differ
diff --git a/public/images/events/pkmnday2025event-en.png b/public/images/events/pkmnday2025event-en.png
new file mode 100644
index 00000000000..e9caa9e19d6
Binary files /dev/null and b/public/images/events/pkmnday2025event-en.png differ
diff --git a/public/images/events/pkmnday2025event-es-ES.png b/public/images/events/pkmnday2025event-es-ES.png
new file mode 100644
index 00000000000..e1ab096dffc
Binary files /dev/null and b/public/images/events/pkmnday2025event-es-ES.png differ
diff --git a/public/images/events/pkmnday2025event-fr.png b/public/images/events/pkmnday2025event-fr.png
new file mode 100644
index 00000000000..037d1e06e61
Binary files /dev/null and b/public/images/events/pkmnday2025event-fr.png differ
diff --git a/public/images/events/pkmnday2025event-it.png b/public/images/events/pkmnday2025event-it.png
new file mode 100644
index 00000000000..f38a60330fa
Binary files /dev/null and b/public/images/events/pkmnday2025event-it.png differ
diff --git a/public/images/events/pkmnday2025event-ja.png b/public/images/events/pkmnday2025event-ja.png
new file mode 100644
index 00000000000..94b02ad93a0
Binary files /dev/null and b/public/images/events/pkmnday2025event-ja.png differ
diff --git a/public/images/events/pkmnday2025event-ko.png b/public/images/events/pkmnday2025event-ko.png
new file mode 100644
index 00000000000..aed9ee3fb28
Binary files /dev/null and b/public/images/events/pkmnday2025event-ko.png differ
diff --git a/public/images/events/pkmnday2025event-pt-BR.png b/public/images/events/pkmnday2025event-pt-BR.png
new file mode 100644
index 00000000000..2190bbac535
Binary files /dev/null and b/public/images/events/pkmnday2025event-pt-BR.png differ
diff --git a/public/images/events/pkmnday2025event-zh-CN.png b/public/images/events/pkmnday2025event-zh-CN.png
new file mode 100644
index 00000000000..a3430482dd0
Binary files /dev/null and b/public/images/events/pkmnday2025event-zh-CN.png differ
diff --git a/public/images/pokemon/656.png b/public/images/pokemon/656.png
index 6acfe282dca..06a9cd58268 100644
Binary files a/public/images/pokemon/656.png and b/public/images/pokemon/656.png differ
diff --git a/public/images/pokemon/variant/656.json b/public/images/pokemon/variant/656.json
index 68743a4c9f1..5037f86f22a 100644
--- a/public/images/pokemon/variant/656.json
+++ b/public/images/pokemon/variant/656.json
@@ -3,12 +3,12 @@
"838394": "4d7dc5",
"62ace6": "8363af",
"7bcdff": "9c75c2",
- "ffec8c": "ddfff9",
+ "fdea88": "ddfff9",
"a1a1c4": "7ab7ec",
"c9b241": "97d6e2",
- "dfcf77": "bae7e8",
+ "ccbd70": "bae7e8",
"174592": "37408c",
- "fdfdfd": "b1e5ff",
+ "f8f8f8": "b1e5ff",
"9c9cc5": "5385c7",
"cdcde6": "7eb7e8",
"396a83": "362864",
@@ -18,12 +18,12 @@
"838394": "cc6845",
"62ace6": "c44848",
"7bcdff": "dd6155",
- "ffec8c": "ddfff9",
+ "fdea88": "ddfff9",
"a1a1c4": "f7c685",
"c9b241": "97d6e2",
- "dfcf77": "bae7e8",
+ "ccbd70": "bae7e8",
"174592": "198158",
- "fdfdfd": "fff4bd",
+ "f8f8f8": "fff4bd",
"9c9cc5": "c96a48",
"cdcde6": "f7b785",
"396a83": "5c0d33",
diff --git a/public/images/pokemon/variant/back/656.json b/public/images/pokemon/variant/back/656.json
index 34b11bfab78..f41398f3154 100644
--- a/public/images/pokemon/variant/back/656.json
+++ b/public/images/pokemon/variant/back/656.json
@@ -1,17 +1,17 @@
{
"1": {
- "838394": "4d7dc5",
+ "848496": "4d7dc5",
"7bcdff": "9c75c2",
"62ace6": "8363af",
"ffffff": "b1e5ff",
"396a83": "362864",
"9c9cc5": "5385c7",
"cdcde6": "7eb7e8",
- "174592": "198158",
+ "174592": "37408c",
"5a94cd": "7054a4"
},
"2": {
- "838394": "cc6845",
+ "848496": "cc6845",
"7bcdff": "dd6155",
"62ace6": "c44848",
"ffffff": "fff4bd",
diff --git a/public/images/ui/cursor_tera.png b/public/images/ui/cursor_tera.png
new file mode 100644
index 00000000000..34cbe095895
Binary files /dev/null and b/public/images/ui/cursor_tera.png differ
diff --git a/public/images/ui/legacy/cursor_tera.png b/public/images/ui/legacy/cursor_tera.png
new file mode 100644
index 00000000000..f2e77046137
Binary files /dev/null and b/public/images/ui/legacy/cursor_tera.png differ
diff --git a/public/locales b/public/locales
index 5e7fc5ef196..0e5c6096ba2 160000
--- a/public/locales
+++ b/public/locales
@@ -1 +1 @@
-Subproject commit 5e7fc5ef1968652f2335b17c354db62d8cbec314
+Subproject commit 0e5c6096ba26f6b87aed1aab3fe9b0b23f6cbb7b
diff --git a/src/battle-scene.ts b/src/battle-scene.ts
index 8205c1fcebc..996c3b0de87 100644
--- a/src/battle-scene.ts
+++ b/src/battle-scene.ts
@@ -1865,6 +1865,58 @@ export default class BattleScene extends SceneBase {
this.getCurrentPhase()?.constructor.name ?? "",
);
+ if ( // Give trainers with specialty types an appropriately-typed form for Wormadam, Rotom, Arceus, Oricorio, Silvally, or Paldean Tauros.
+ !isEggPhase &&
+ this.currentBattle?.battleType === BattleType.TRAINER && !isNullOrUndefined(this.currentBattle.trainer) &&
+ this.currentBattle.trainer.config.hasSpecialtyType()
+ ) {
+ if (species.speciesId === Species.WORMADAM) {
+ switch (this.currentBattle.trainer.config.specialtyType) {
+ case Type.GROUND:
+ return 1; // Sandy Cloak
+ case Type.STEEL:
+ return 2; // Trash Cloak
+ case Type.GRASS:
+ return 0; // Plant Cloak
+ }
+ } else if (species.speciesId === Species.ROTOM) {
+ switch (this.currentBattle.trainer.config.specialtyType) {
+ case Type.FLYING:
+ return 4; // Fan Rotom
+ case Type.GHOST:
+ return 0; // Lightbulb Rotom
+ case Type.FIRE:
+ return 1; // Heat Rotom
+ case Type.GRASS:
+ return 5; // Mow Rotom
+ case Type.WATER:
+ return 2; // Wash Rotom
+ case Type.ICE:
+ return 3; // Frost Rotom
+ }
+ } else if (species.speciesId === Species.ORICORIO) {
+ switch (this.currentBattle.trainer.config.specialtyType) {
+ case Type.GHOST:
+ return 3; // Sensu Style
+ case Type.FIRE:
+ return 0; // Baile Style
+ case Type.ELECTRIC:
+ return 1; // Pom-Pom Style
+ case Type.PSYCHIC:
+ return 2; // Pa'u Style
+ }
+ } else if (species.speciesId === Species.PALDEA_TAUROS) {
+ switch (this.currentBattle.trainer.config.specialtyType) {
+ case Type.FIRE:
+ return 1; // Blaze Breed
+ case Type.WATER:
+ return 2; // Aqua Breed
+ }
+ } else if (species.speciesId === Species.SILVALLY || species.speciesId === Species.ARCEUS) { // Would probably never happen, but might as well
+ return this.currentBattle.trainer.config.specialtyType;
+ }
+ }
+
switch (species.speciesId) {
case Species.UNOWN:
case Species.SHELLOS:
@@ -1872,8 +1924,6 @@ export default class BattleScene extends SceneBase {
case Species.BASCULIN:
case Species.DEERLING:
case Species.SAWSBUCK:
- case Species.FROAKIE:
- case Species.FROGADIER:
case Species.SCATTERBUG:
case Species.SPEWPA:
case Species.VIVILLON:
@@ -1907,9 +1957,14 @@ export default class BattleScene extends SceneBase {
return 0; // No Partner Eevee for Wave 12 Preschoolers
}
return Utils.randSeedInt(2);
+ case Species.FROAKIE:
+ case Species.FROGADIER:
case Species.GRENINJA:
- if (this.currentBattle?.battleType === BattleType.TRAINER) {
- return 0; // Don't give trainers Battle Bond Greninja
+ if (
+ this.currentBattle?.battleType === BattleType.TRAINER &&
+ !isEggPhase
+ ) {
+ return 0; // Don't give trainers Battle Bond Greninja, Froakie or Frogadier
}
return Utils.randSeedInt(2);
case Species.URSHIFU:
diff --git a/src/data/ability.ts b/src/data/ability.ts
index 8c4b2ba380a..37b97ffb5e6 100644
--- a/src/data/ability.ts
+++ b/src/data/ability.ts
@@ -5054,7 +5054,7 @@ export class PreventBypassSpeedChanceAbAttr extends AbAttr {
const turnCommand = globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()];
const isCommandFight = turnCommand?.command === Command.FIGHT;
const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null;
- if (this.condition(pokemon, move!) && isCommandFight) {
+ if (isCommandFight && this.condition(pokemon, move!)) {
bypassSpeed.value = false;
canCheckHeldItems.value = false;
return false;
@@ -6186,7 +6186,8 @@ export function initAbilities() {
.attr(ProtectStatAbAttr, Stat.ATK)
.ignorable(),
new Ability(Abilities.PICKUP, 3)
- .attr(PostBattleLootAbAttr),
+ .attr(PostBattleLootAbAttr)
+ .attr(UnsuppressableAbilityAbAttr),
new Ability(Abilities.TRUANT, 3)
.attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.TRUANT, 1, false),
new Ability(Abilities.HUSTLE, 3)
@@ -6378,7 +6379,8 @@ export function initAbilities() {
.attr(PostSummonWeatherChangeAbAttr, WeatherType.SNOW)
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SNOW),
new Ability(Abilities.HONEY_GATHER, 4)
- .attr(MoneyAbAttr),
+ .attr(MoneyAbAttr)
+ .attr(UnsuppressableAbilityAbAttr),
new Ability(Abilities.FRISK, 4)
.attr(FriskAbAttr),
new Ability(Abilities.RECKLESS, 4)
diff --git a/src/data/balance/starters.ts b/src/data/balance/starters.ts
index 10263f895b3..3468163c988 100644
--- a/src/data/balance/starters.ts
+++ b/src/data/balance/starters.ts
@@ -461,7 +461,7 @@ export const speciesStarterCosts = {
[Species.GUZZLORD]: 6,
[Species.NECROZMA]: 8,
[Species.MAGEARNA]: 7,
- [Species.MARSHADOW]: 7,
+ [Species.MARSHADOW]: 8,
[Species.POIPOLE]: 8,
[Species.STAKATAKA]: 6,
[Species.BLACEPHALON]: 7,
diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts
index a179f3a3e9b..a42779563f2 100644
--- a/src/data/battle-anims.ts
+++ b/src/data/battle-anims.ts
@@ -1,7 +1,20 @@
import { globalScene } from "#app/global-scene";
-import { AttackMove, BeakBlastHeaderAttr, DelayedAttackAttr, MoveFlags, SelfStatusMove, allMoves } from "./move";
+import {
+ AttackMove,
+ BeakBlastHeaderAttr,
+ DelayedAttackAttr,
+ MoveFlags,
+ SelfStatusMove,
+ allMoves,
+} from "./move";
import type Pokemon from "../field/pokemon";
-import * as Utils from "../utils";
+import {
+ type nil,
+ getFrameMs,
+ getEnumKeys,
+ getEnumValues,
+ animationFileName,
+} from "../utils";
import type { BattlerIndex } from "../battle";
import type { Element } from "json-stable-stringify";
import { Moves } from "#enums/moves";
@@ -401,7 +414,7 @@ class AnimTimedUpdateBgEvent extends AnimTimedBgEvent {
if (Object.keys(tweenProps).length) {
globalScene.tweens.add(Object.assign({
targets: moveAnim.bgSprite,
- duration: Utils.getFrameMs(this.duration * 3)
+ duration: getFrameMs(this.duration * 3)
}, tweenProps));
}
return this.duration * 2;
@@ -437,7 +450,7 @@ class AnimTimedAddBgEvent extends AnimTimedBgEvent {
globalScene.tweens.add({
targets: moveAnim.bgSprite,
- duration: Utils.getFrameMs(this.duration * 3)
+ duration: getFrameMs(this.duration * 3)
});
return this.duration * 2;
@@ -455,8 +468,8 @@ export const encounterAnims = new Map();
export function initCommonAnims(): Promise {
return new Promise(resolve => {
- const commonAnimNames = Utils.getEnumKeys(CommonAnim);
- const commonAnimIds = Utils.getEnumValues(CommonAnim);
+ const commonAnimNames = getEnumKeys(CommonAnim);
+ const commonAnimIds = getEnumValues(CommonAnim);
const commonAnimFetches: Promise