Merge branch 'upcoming' into signpost
@ -23,20 +23,18 @@ body:
|
|||||||
label: Version
|
label: Version
|
||||||
description: What version of pokeemerald-expansion are you using as a base?
|
description: What version of pokeemerald-expansion are you using as a base?
|
||||||
options:
|
options:
|
||||||
- 1.8.5 (Latest release)
|
- 1.9.1 (Latest release)
|
||||||
- master (default, unreleased bugfixes)
|
- master (default, unreleased bugfixes)
|
||||||
- upcoming (Edge)
|
- upcoming (Edge)
|
||||||
|
- 1.9.0
|
||||||
|
- 1.8.6
|
||||||
|
- 1.8.5
|
||||||
- 1.8.4
|
- 1.8.4
|
||||||
- 1.8.3
|
- 1.8.3
|
||||||
- 1.8.2
|
- 1.8.2
|
||||||
- 1.8.1
|
- 1.8.1
|
||||||
- 1.8.0
|
- 1.8.0
|
||||||
- 1.7.4
|
- pre-1.8.0
|
||||||
- 1.7.3
|
|
||||||
- 1.7.2
|
|
||||||
- 1.7.1
|
|
||||||
- 1.7.0
|
|
||||||
- pre-1.7.0
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
|
|||||||
12
.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml
vendored
@ -23,20 +23,18 @@ body:
|
|||||||
label: Version
|
label: Version
|
||||||
description: What version of pokeemerald-expansion are you using as a base?
|
description: What version of pokeemerald-expansion are you using as a base?
|
||||||
options:
|
options:
|
||||||
- 1.8.5 (Latest release)
|
- 1.9.1 (Latest release)
|
||||||
- master (default, unreleased bugfixes)
|
- master (default, unreleased bugfixes)
|
||||||
- upcoming (Edge)
|
- upcoming (Edge)
|
||||||
|
- 1.9.0
|
||||||
|
- 1.8.6
|
||||||
|
- 1.8.5
|
||||||
- 1.8.4
|
- 1.8.4
|
||||||
- 1.8.3
|
- 1.8.3
|
||||||
- 1.8.2
|
- 1.8.2
|
||||||
- 1.8.1
|
- 1.8.1
|
||||||
- 1.8.0
|
- 1.8.0
|
||||||
- 1.7.4
|
- pre-1.8.0
|
||||||
- 1.7.3
|
|
||||||
- 1.7.2
|
|
||||||
- 1.7.1
|
|
||||||
- 1.7.0
|
|
||||||
- pre-1.7.0
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
|
|||||||
12
.github/ISSUE_TEMPLATE/04_other_errors.yaml
vendored
@ -23,20 +23,18 @@ body:
|
|||||||
label: Version
|
label: Version
|
||||||
description: What version of pokeemerald-expansion are you using as a base?
|
description: What version of pokeemerald-expansion are you using as a base?
|
||||||
options:
|
options:
|
||||||
- 1.8.5 (Latest release)
|
- 1.9.1 (Latest release)
|
||||||
- master (default, unreleased bugfixes)
|
- master (default, unreleased bugfixes)
|
||||||
- upcoming (Edge)
|
- upcoming (Edge)
|
||||||
|
- 1.9.0
|
||||||
|
- 1.8.6
|
||||||
|
- 1.8.5
|
||||||
- 1.8.4
|
- 1.8.4
|
||||||
- 1.8.3
|
- 1.8.3
|
||||||
- 1.8.2
|
- 1.8.2
|
||||||
- 1.8.1
|
- 1.8.1
|
||||||
- 1.8.0
|
- 1.8.0
|
||||||
- 1.7.4
|
- pre-1.8.0
|
||||||
- 1.7.3
|
|
||||||
- 1.7.2
|
|
||||||
- 1.7.1
|
|
||||||
- 1.7.0
|
|
||||||
- pre-1.7.0
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
|
|||||||
23
.github/workflows/build.yml
vendored
@ -15,19 +15,12 @@ jobs:
|
|||||||
GAME_VERSION: EMERALD
|
GAME_VERSION: EMERALD
|
||||||
GAME_REVISION: 0
|
GAME_REVISION: 0
|
||||||
GAME_LANGUAGE: ENGLISH
|
GAME_LANGUAGE: ENGLISH
|
||||||
MODERN: 0
|
|
||||||
COMPARE: 0
|
COMPARE: 0
|
||||||
UNUSED_ERROR: 1
|
UNUSED_ERROR: 1
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Checkout agbcc
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
path: agbcc
|
|
||||||
repository: pret/agbcc
|
|
||||||
|
|
||||||
- name: Install binutils
|
- name: Install binutils
|
||||||
run: |
|
run: |
|
||||||
sudo apt update
|
sudo apt update
|
||||||
@ -36,27 +29,13 @@ jobs:
|
|||||||
# gcc-arm-none-eabi is only needed for the modern build
|
# gcc-arm-none-eabi is only needed for the modern build
|
||||||
# as an alternative to dkP
|
# as an alternative to dkP
|
||||||
|
|
||||||
- name: Install agbcc
|
- name: ROM
|
||||||
run: |
|
|
||||||
./build.sh
|
|
||||||
./install.sh ../
|
|
||||||
working-directory: agbcc
|
|
||||||
|
|
||||||
- name: Agbcc
|
|
||||||
env:
|
env:
|
||||||
MODERN: 0
|
|
||||||
COMPARE: 0
|
|
||||||
run: make -j${nproc} -O all
|
|
||||||
|
|
||||||
- name: Modern
|
|
||||||
env:
|
|
||||||
MODERN: 1
|
|
||||||
COMPARE: 0
|
COMPARE: 0
|
||||||
run: make -j${nproc} -O all
|
run: make -j${nproc} -O all
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
env:
|
env:
|
||||||
MODERN: 1
|
|
||||||
TEST: 1
|
TEST: 1
|
||||||
run: |
|
run: |
|
||||||
make -j${nproc} -O pokeemerald-test.elf
|
make -j${nproc} -O pokeemerald-test.elf
|
||||||
|
|||||||
@ -1,6 +1,11 @@
|
|||||||
# Pokeemerald-Expansion Changelogs
|
# Pokeemerald-Expansion Changelogs
|
||||||
|
|
||||||
|
## 1.9.x
|
||||||
|
- **[Version 1.9.1](docs/changelogs/1.9.x/1.9.1.md) - 🧹 Bugfix Release**
|
||||||
|
- **[Version 1.9.0](docs/changelogs/1.9.x/1.9.0.md) - ✨ Feature Release**
|
||||||
|
|
||||||
## 1.8.x
|
## 1.8.x
|
||||||
|
- **[Version 1.8.6](docs/changelogs/1.8.x/1.8.6.md) - 🧹 Bugfix Release**
|
||||||
- **[Version 1.8.5](docs/changelogs/1.8.x/1.8.5.md) - 🧹 Bugfix Release**
|
- **[Version 1.8.5](docs/changelogs/1.8.x/1.8.5.md) - 🧹 Bugfix Release**
|
||||||
- **[Version 1.8.4](docs/changelogs/1.8.x/1.8.4.md) - 🧹 Bugfix Release**
|
- **[Version 1.8.4](docs/changelogs/1.8.x/1.8.4.md) - 🧹 Bugfix Release**
|
||||||
- **[Version 1.8.3](docs/changelogs/1.8.x/1.8.3.md) - 🧹 Bugfix Release**
|
- **[Version 1.8.3](docs/changelogs/1.8.x/1.8.3.md) - 🧹 Bugfix Release**
|
||||||
|
|||||||
78
INSTALL.md
@ -33,27 +33,23 @@ WSL1 is the preferred terminal to build **pokeemerald Expansion**. The following
|
|||||||
- Otherwise, **open WSL** and go to [Choosing where to store pokeemerald Expansion (WSL1)](#Choosing-where-to-store-pokeemerald-expansion-WSL1).
|
- Otherwise, **open WSL** and go to [Choosing where to store pokeemerald Expansion (WSL1)](#Choosing-where-to-store-pokeemerald-expansion-WSL1).
|
||||||
|
|
||||||
### Installing WSL1
|
### Installing WSL1
|
||||||
1. Open [Windows Powershell **as Administrator**](https://i.imgur.com/QKmVbP9.png), and run the following command (Right Click or Shift+Insert is paste in the Powershell).
|
1. Open [Windows Powershell **as Administrator**](https://i.imgur.com/QKmVbP9.png), and run the following commands (Right Click or Shift+Insert is paste in the Powershell).
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
|
wsl --install -d Ubuntu --enable-wsl1
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Once the process finishes, restart your machine.
|
2. Once the process finishes, restart your machine.
|
||||||
|
|
||||||
3. The next step is to choose and install a Linux distribution from the Microsoft Store. The following instructions will assume Ubuntu as the Linux distribution of choice.
|
3. Open Windows Powershell **as Administrator** again (after restarting), and run the following command to configure Ubuntu to use WSL1.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
wsl --set-version Ubuntu 1
|
||||||
|
```
|
||||||
<details>
|
<details>
|
||||||
<summary><i>Note for advanced users...</i></summary>
|
<summary><i>Note...</i></summary>
|
||||||
|
|
||||||
> You can pick a preferred Linux distribution, but setup instructions may differ. Debian should work with the given instructions, but has not been tested.
|
> WSL may open automatically after restarting, but you can ignore it for now.
|
||||||
</details>
|
|
||||||
|
|
||||||
4. Open the [Microsoft Store Linux Selection](https://aka.ms/wslstore), click Ubuntu, then click Get, which will install the Ubuntu distribution.
|
|
||||||
<details>
|
|
||||||
<summary><i>Notes...</i></summary>
|
|
||||||
|
|
||||||
> Note 1: If a dialog pops up asking for you to sign into a Microsoft Account, then just close the dialog.
|
|
||||||
> Note 2: If the link does not work, then open the Microsoft Store manually, and search for the Ubuntu app (choose the one with no version number).
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### Setting up WSL1
|
### Setting up WSL1
|
||||||
@ -331,7 +327,7 @@ If this works, then proceed to [Installation](#installation). Otherwise, ask for
|
|||||||
libpng is now installed.
|
libpng is now installed.
|
||||||
|
|
||||||
Continue to [Installing pkg-config (macOS)](#installing-pkg-config-macos) if **pkg-config is not installed**. Otherwise, continue to [Installing devkitARM (macOS)](#installing-devkitarm-macos) if **devkitARM is not installed**.
|
Continue to [Installing pkg-config (macOS)](#installing-pkg-config-macos) if **pkg-config is not installed**. Otherwise, continue to [Installing devkitARM (macOS)](#installing-devkitarm-macos) if **devkitARM is not installed**.
|
||||||
|
|
||||||
If both pkg-config and devkitARM are already installed, go to [Choosing where to store pokeemerald Expansion (macOS)](#choosing-where-to-store-pokeemerald-expansion-macos).
|
If both pkg-config and devkitARM are already installed, go to [Choosing where to store pokeemerald Expansion (macOS)](#choosing-where-to-store-pokeemerald-expansion-macos).
|
||||||
|
|
||||||
### Installing pkg-config (macOS)
|
### Installing pkg-config (macOS)
|
||||||
@ -545,7 +541,7 @@ If this works, then proceed to [Installation](#installation). Otherwise, ask for
|
|||||||
> ```
|
> ```
|
||||||
> Where *\<folder where pokeemerald-expansion is to be stored>* is the path of the folder [where you chose to store pokeemerald Expansion](#Choosing-where-to-store-pokeemerald-expansion-WSL1). Then run the `git clone` command again.
|
> Where *\<folder where pokeemerald-expansion is to be stored>* is the path of the folder [where you chose to store pokeemerald Expansion](#Choosing-where-to-store-pokeemerald-expansion-WSL1). Then run the `git clone` command again.
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
Now you're ready to build pokeemerald Expansion.
|
Now you're ready to build pokeemerald Expansion.
|
||||||
|
|
||||||
## Build pokeemerald Expansion
|
## Build pokeemerald Expansion
|
||||||
@ -600,58 +596,6 @@ To build **pokeemerald.elf** with debug symbols under a modern toolchain:
|
|||||||
```bash
|
```bash
|
||||||
make DINFO=1
|
make DINFO=1
|
||||||
```
|
```
|
||||||
Note that this is not necessary for a non-modern (agbcc) build since those are built with debug symbols by default.
|
|
||||||
|
|
||||||
### agbcc
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><i>Deprecated; installing agbcc is optional since 1.7.0</i>.</summary>
|
|
||||||
|
|
||||||
1. Install agbcc into pokeemerald-expansion. The commands to run depend on certain conditions. **You should only follow one of the listed instructions**:
|
|
||||||
- If agbcc has **not been built before** in the folder where you chose to store pokeemerald Expansion, run the following commands to build and install it into pokeemerald-expansion:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/pret/agbcc
|
|
||||||
cd agbcc
|
|
||||||
./build.sh
|
|
||||||
./install.sh ../pokeemerald-expansion
|
|
||||||
```
|
|
||||||
|
|
||||||
- **Otherwise**, if agbcc has been built before (e.g. if the git clone above fails), but was **last built on a different terminal** than the one currently used (only relevant to Windows, e.g. switching from msys2 to WSL1), then run the following commands to build and install it into pokeemerald-expansion:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd agbcc
|
|
||||||
git clean -fX
|
|
||||||
./build.sh
|
|
||||||
./install.sh ../pokeemerald-expansion
|
|
||||||
```
|
|
||||||
|
|
||||||
- **Otherwise**, if agbcc has been built before on the same terminal, run the following commands to install agbcc into pokeemerald-expansion:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd agbcc
|
|
||||||
./install.sh ../pokeemerald-expansion
|
|
||||||
```
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><i>Note...</i></summary>
|
|
||||||
|
|
||||||
> If building agbcc or pokeemerald results in an error, try deleting the agbcc folder and re-installing agbcc as if it has not been built before.
|
|
||||||
</details>
|
|
||||||
|
|
||||||
2. Once agbcc is installed, change directory back to the base directory where pokeemerald-expansion and agbcc are stored:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd ..
|
|
||||||
```
|
|
||||||
|
|
||||||
3. To compile with agbcc:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
make agbcc
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
# Useful additional tools
|
# Useful additional tools
|
||||||
|
|
||||||
|
|||||||
134
Makefile
@ -25,10 +25,8 @@ AS := $(PREFIX)as
|
|||||||
|
|
||||||
LD := $(PREFIX)ld
|
LD := $(PREFIX)ld
|
||||||
|
|
||||||
# note: the makefile must be set up so MODERNCC is never called
|
ARMCC := $(PREFIX)gcc
|
||||||
# if MODERN=0
|
PATH_ARMCC := PATH="$(PATH)" $(ARMCC)
|
||||||
MODERNCC := $(PREFIX)gcc
|
|
||||||
PATH_MODERNCC := PATH="$(PATH)" $(MODERNCC)
|
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT)
|
ifeq ($(OS),Windows_NT)
|
||||||
EXE := .exe
|
EXE := .exe
|
||||||
@ -40,45 +38,20 @@ TITLE := POKEMON EMER
|
|||||||
GAME_CODE := BPEE
|
GAME_CODE := BPEE
|
||||||
MAKER_CODE := 01
|
MAKER_CODE := 01
|
||||||
REVISION := 0
|
REVISION := 0
|
||||||
MODERN ?= 1
|
|
||||||
TEST ?= 0
|
TEST ?= 0
|
||||||
ANALYZE ?= 0
|
ANALYZE ?= 0
|
||||||
UNUSED_ERROR ?= 0
|
UNUSED_ERROR ?= 0
|
||||||
|
|
||||||
ifeq (agbcc,$(MAKECMDGOALS))
|
|
||||||
MODERN := 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq (check,$(MAKECMDGOALS))
|
ifeq (check,$(MAKECMDGOALS))
|
||||||
TEST := 1
|
TEST := 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# use arm-none-eabi-cpp for macOS
|
CPP := $(PREFIX)cpp
|
||||||
# as macOS's default compiler is clang
|
|
||||||
# and clang's preprocessor will warn on \u
|
|
||||||
# when preprocessing asm files, expecting a unicode literal
|
|
||||||
# we can't unconditionally use arm-none-eabi-cpp
|
|
||||||
# as installations which install binutils-arm-none-eabi
|
|
||||||
# don't come with it
|
|
||||||
ifneq ($(MODERN),1)
|
|
||||||
ifeq ($(shell uname -s),Darwin)
|
|
||||||
CPP := $(PREFIX)cpp
|
|
||||||
else
|
|
||||||
CPP := $(CC) -E
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
CPP := $(PREFIX)cpp
|
|
||||||
endif
|
|
||||||
|
|
||||||
ROM_NAME := pokeemerald_agbcc.gba
|
ROM_NAME := pokeemerald.gba
|
||||||
ELF_NAME := $(ROM_NAME:.gba=.elf)
|
ELF_NAME := $(ROM_NAME:.gba=.elf)
|
||||||
MAP_NAME := $(ROM_NAME:.gba=.map)
|
MAP_NAME := $(ROM_NAME:.gba=.map)
|
||||||
OBJ_DIR_NAME := build/emerald
|
OBJ_DIR_NAME := build/modern
|
||||||
|
|
||||||
MODERN_ROM_NAME := pokeemerald.gba
|
|
||||||
MODERN_ELF_NAME := $(MODERN_ROM_NAME:.gba=.elf)
|
|
||||||
MODERN_MAP_NAME := $(MODERN_ROM_NAME:.gba=.map)
|
|
||||||
MODERN_OBJ_DIR_NAME := build/modern
|
|
||||||
|
|
||||||
SHELL := bash -o pipefail
|
SHELL := bash -o pipefail
|
||||||
|
|
||||||
@ -86,14 +59,8 @@ ELF = $(ROM:.gba=.elf)
|
|||||||
MAP = $(ROM:.gba=.map)
|
MAP = $(ROM:.gba=.map)
|
||||||
SYM = $(ROM:.gba=.sym)
|
SYM = $(ROM:.gba=.sym)
|
||||||
|
|
||||||
TEST_OBJ_DIR_NAME_MODERN := build/modern-test
|
TEST_OBJ_DIR_NAME := build/modern-test
|
||||||
TEST_OBJ_DIR_NAME_AGBCC := build/test
|
|
||||||
|
|
||||||
ifeq ($(MODERN),0)
|
|
||||||
TEST_OBJ_DIR_NAME := $(TEST_OBJ_DIR_NAME_AGBCC)
|
|
||||||
else
|
|
||||||
TEST_OBJ_DIR_NAME := $(TEST_OBJ_DIR_NAME_MODERN)
|
|
||||||
endif
|
|
||||||
TESTELF = $(ROM:.gba=-test.elf)
|
TESTELF = $(ROM:.gba=-test.elf)
|
||||||
HEADLESSELF = $(ROM:.gba=-test-headless.elf)
|
HEADLESSELF = $(ROM:.gba=-test-headless.elf)
|
||||||
|
|
||||||
@ -116,17 +83,9 @@ SONG_BUILDDIR = $(OBJ_DIR)/$(SONG_SUBDIR)
|
|||||||
MID_BUILDDIR = $(OBJ_DIR)/$(MID_SUBDIR)
|
MID_BUILDDIR = $(OBJ_DIR)/$(MID_SUBDIR)
|
||||||
TEST_BUILDDIR = $(OBJ_DIR)/$(TEST_SUBDIR)
|
TEST_BUILDDIR = $(OBJ_DIR)/$(TEST_SUBDIR)
|
||||||
|
|
||||||
ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=$(MODERN)
|
ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=1
|
||||||
|
|
||||||
ifeq ($(MODERN),0)
|
CC1 = $(shell $(PATH_ARMCC) --print-prog-name=cc1) -quiet
|
||||||
CC1 := tools/agbcc/bin/agbcc$(EXE)
|
|
||||||
override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm -g
|
|
||||||
ROM := $(ROM_NAME)
|
|
||||||
OBJ_DIR := $(OBJ_DIR_NAME)
|
|
||||||
LIBPATH := -L ../../tools/agbcc/lib
|
|
||||||
LIB := $(LIBPATH) -lgcc -lc -L../../libagbsyscall -lagbsyscall
|
|
||||||
else
|
|
||||||
CC1 = $(shell $(PATH_MODERNCC) --print-prog-name=cc1) -quiet
|
|
||||||
override CFLAGS += -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init
|
override CFLAGS += -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init
|
||||||
ifeq ($(ANALYZE),1)
|
ifeq ($(ANALYZE),1)
|
||||||
override CFLAGS += -fanalyzer
|
override CFLAGS += -fanalyzer
|
||||||
@ -137,11 +96,10 @@ ifneq ($(GITHUB_REPOSITORY_OWNER),rh-hideout)
|
|||||||
override CFLAGS += -Wno-error=unused-variable -Wno-error=unused-const-variable -Wno-error=unused-parameter -Wno-error=unused-function -Wno-error=unused-but-set-parameter -Wno-error=unused-but-set-variable -Wno-error=unused-value -Wno-error=unused-local-typedefs
|
override CFLAGS += -Wno-error=unused-variable -Wno-error=unused-const-variable -Wno-error=unused-parameter -Wno-error=unused-function -Wno-error=unused-but-set-parameter -Wno-error=unused-but-set-variable -Wno-error=unused-value -Wno-error=unused-local-typedefs
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ROM := $(MODERN_ROM_NAME)
|
ROM := $(ROM_NAME)
|
||||||
OBJ_DIR := $(MODERN_OBJ_DIR_NAME)
|
OBJ_DIR := $(OBJ_DIR_NAME)
|
||||||
LIBPATH := -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libnosys.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libc.a))"
|
LIBPATH := -L "$(dir $(shell $(PATH_ARMCC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(PATH_ARMCC) -mthumb -print-file-name=libnosys.a))" -L "$(dir $(shell $(PATH_ARMCC) -mthumb -print-file-name=libc.a))"
|
||||||
LIB := $(LIBPATH) -lc -lnosys -lgcc -L../../libagbsyscall -lagbsyscall
|
LIB := $(LIBPATH) -lc -lnosys -lgcc -L../../libagbsyscall -lagbsyscall
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(TESTELF),$(MAKECMDGOALS))
|
ifeq ($(TESTELF),$(MAKECMDGOALS))
|
||||||
TEST := 1
|
TEST := 1
|
||||||
@ -151,10 +109,7 @@ ifeq ($(TEST),1)
|
|||||||
OBJ_DIR := $(TEST_OBJ_DIR_NAME)
|
OBJ_DIR := $(TEST_OBJ_DIR_NAME)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CPPFLAGS := -iquote include -iquote $(GFLIB_SUBDIR) -Wno-trigraphs -DMODERN=$(MODERN) -DTESTING=$(TEST)
|
CPPFLAGS := -iquote include -iquote $(GFLIB_SUBDIR) -Wno-trigraphs -DMODERN=1 -DTESTING=$(TEST)
|
||||||
ifneq ($(MODERN),1)
|
|
||||||
CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef
|
|
||||||
endif
|
|
||||||
|
|
||||||
SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c
|
SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c
|
||||||
GFX := tools/gbagfx/gbagfx$(EXE)
|
GFX := tools/gbagfx/gbagfx$(EXE)
|
||||||
@ -301,26 +256,17 @@ mostlyclean: tidynonmodern tidymodern tidycheck
|
|||||||
rm -f $(AUTO_GEN_TARGETS)
|
rm -f $(AUTO_GEN_TARGETS)
|
||||||
@$(MAKE) clean -C libagbsyscall
|
@$(MAKE) clean -C libagbsyscall
|
||||||
|
|
||||||
tidy: tidynonmodern tidymodern tidycheck
|
tidy: tidymodern tidycheck
|
||||||
|
|
||||||
tidynonmodern:
|
tidymodern:
|
||||||
rm -f $(ROM_NAME) $(ELF_NAME) $(MAP_NAME)
|
rm -f $(ROM_NAME) $(ELF_NAME) $(MAP_NAME)
|
||||||
rm -rf $(OBJ_DIR_NAME)
|
rm -rf $(OBJ_DIR_NAME)
|
||||||
|
|
||||||
tidymodern:
|
|
||||||
rm -f $(MODERN_ROM_NAME) $(MODERN_ELF_NAME) $(MODERN_MAP_NAME)
|
|
||||||
rm -rf $(MODERN_OBJ_DIR_NAME)
|
|
||||||
|
|
||||||
tidycheck:
|
tidycheck:
|
||||||
rm -f $(TESTELF) $(HEADLESSELF)
|
rm -f $(TESTELF) $(HEADLESSELF)
|
||||||
rm -rf $(TEST_OBJ_DIR_NAME_MODERN)
|
rm -rf $(TEST_OBJ_DIR_NAME)
|
||||||
rm -rf $(TEST_OBJ_DIR_NAME_AGBCC)
|
|
||||||
|
|
||||||
|
|
||||||
ifneq ($(MODERN),0)
|
|
||||||
$(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member
|
|
||||||
endif
|
|
||||||
|
|
||||||
include graphics_file_rules.mk
|
include graphics_file_rules.mk
|
||||||
include map_data_rules.mk
|
include map_data_rules.mk
|
||||||
include spritesheet_rules.mk
|
include spritesheet_rules.mk
|
||||||
@ -346,30 +292,14 @@ sound/%.bin: sound/%.aif ; $(AIF) $< $@
|
|||||||
|
|
||||||
COMPETITIVE_PARTY_SYNTAX := $(shell PATH="$(PATH)"; echo 'COMPETITIVE_PARTY_SYNTAX' | $(CPP) $(CPPFLAGS) -imacros include/global.h | tail -n1)
|
COMPETITIVE_PARTY_SYNTAX := $(shell PATH="$(PATH)"; echo 'COMPETITIVE_PARTY_SYNTAX' | $(CPP) $(CPPFLAGS) -imacros include/global.h | tail -n1)
|
||||||
ifeq ($(COMPETITIVE_PARTY_SYNTAX),1)
|
ifeq ($(COMPETITIVE_PARTY_SYNTAX),1)
|
||||||
%.h: %.party tools ; $(CPP) $(CPPFLAGS) -traditional-cpp - < $< | sed '/#[^p]/d' | $(TRAINERPROC) -o $@ -i $< -
|
%.h: %.party tools ; $(CPP) $(CPPFLAGS) -traditional-cpp - < $< | $(TRAINERPROC) -o $@ -i $< -
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(MODERN),0)
|
$(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member
|
||||||
$(C_BUILDDIR)/libc.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)
|
|
||||||
$(C_BUILDDIR)/libc.o: CFLAGS := -O2
|
|
||||||
|
|
||||||
$(C_BUILDDIR)/siirtc.o: CFLAGS := -mthumb-interwork
|
|
||||||
|
|
||||||
$(C_BUILDDIR)/agb_flash.o: CFLAGS := -O -mthumb-interwork
|
|
||||||
$(C_BUILDDIR)/agb_flash_1m.o: CFLAGS := -O -mthumb-interwork
|
|
||||||
$(C_BUILDDIR)/agb_flash_mx.o: CFLAGS := -O -mthumb-interwork
|
|
||||||
|
|
||||||
$(C_BUILDDIR)/m4a.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)
|
|
||||||
|
|
||||||
$(C_BUILDDIR)/record_mixing.o: CFLAGS += -ffreestanding
|
|
||||||
$(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm$(EXE)
|
|
||||||
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet
|
|
||||||
else
|
|
||||||
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast
|
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast
|
||||||
$(C_BUILDDIR)/pokedex_plus_hgss.o: CFLAGS := -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init
|
$(C_BUILDDIR)/pokedex_plus_hgss.o: CFLAGS := -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init
|
||||||
# Annoyingly we can't turn this on just for src/data/trainers.h
|
# Annoyingly we can't turn this on just for src/data/trainers.h
|
||||||
$(C_BUILDDIR)/data.o: CFLAGS += -fno-show-column -fno-diagnostics-show-caret
|
$(C_BUILDDIR)/data.o: CFLAGS += -fno-show-column -fno-diagnostics-show-caret
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(DINFO),1)
|
ifeq ($(DINFO),1)
|
||||||
override CFLAGS += -g
|
override CFLAGS += -g
|
||||||
@ -384,7 +314,7 @@ ifeq ($(NODEP),1)
|
|||||||
$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.c
|
$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.c
|
||||||
ifeq (,$(KEEP_TEMPS))
|
ifeq (,$(KEEP_TEMPS))
|
||||||
@echo "$(CC1) <flags> -o $@ $<"
|
@echo "$(CC1) <flags> -o $@ $<"
|
||||||
@$(CPP) $(CPPFLAGS) $< | $(PREPROC) $< charmap.txt -i | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ -
|
@$(CPP) $(CPPFLAGS) $< | $(PREPROC) -i $< charmap.txt | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ -
|
||||||
else
|
else
|
||||||
@$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i
|
@$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i
|
||||||
@$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(C_BUILDDIR)/$*.s
|
@$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(C_BUILDDIR)/$*.s
|
||||||
@ -396,7 +326,7 @@ define C_DEP
|
|||||||
$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
|
$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
|
||||||
ifeq (,$$(KEEP_TEMPS))
|
ifeq (,$$(KEEP_TEMPS))
|
||||||
@echo "$$(CC1) <flags> -o $$@ $$<"
|
@echo "$$(CC1) <flags> -o $$@ $$<"
|
||||||
@$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) $$< charmap.txt -i | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
|
@$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) -i $$< charmap.txt | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
|
||||||
else
|
else
|
||||||
@$$(CPP) $$(CPPFLAGS) $$< -o $$(C_BUILDDIR)/$3.i
|
@$$(CPP) $$(CPPFLAGS) $$< -o $$(C_BUILDDIR)/$3.i
|
||||||
@$$(PREPROC) $$(C_BUILDDIR)/$3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $$(C_BUILDDIR)/$3.s
|
@$$(PREPROC) $$(C_BUILDDIR)/$3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $$(C_BUILDDIR)/$3.s
|
||||||
@ -411,7 +341,7 @@ ifeq ($(NODEP),1)
|
|||||||
$(GFLIB_BUILDDIR)/%.o: $(GFLIB_SUBDIR)/%.c $$(c_dep)
|
$(GFLIB_BUILDDIR)/%.o: $(GFLIB_SUBDIR)/%.c $$(c_dep)
|
||||||
ifeq (,$(KEEP_TEMPS))
|
ifeq (,$(KEEP_TEMPS))
|
||||||
@echo "$(CC1) <flags> -o $@ $<"
|
@echo "$(CC1) <flags> -o $@ $<"
|
||||||
@$(CPP) $(CPPFLAGS) $< | $(PREPROC) $< charmap.txt -i | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ -
|
@$(CPP) $(CPPFLAGS) $< | $(PREPROC) -i $< charmap.txt | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ -
|
||||||
else
|
else
|
||||||
@$(CPP) $(CPPFLAGS) $< -o $(GFLIB_BUILDDIR)/$*.i
|
@$(CPP) $(CPPFLAGS) $< -o $(GFLIB_BUILDDIR)/$*.i
|
||||||
@$(PREPROC) $(GFLIB_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(GFLIB_BUILDDIR)/$*.s
|
@$(PREPROC) $(GFLIB_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(GFLIB_BUILDDIR)/$*.s
|
||||||
@ -423,7 +353,7 @@ define GFLIB_DEP
|
|||||||
$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
|
$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
|
||||||
ifeq (,$$(KEEP_TEMPS))
|
ifeq (,$$(KEEP_TEMPS))
|
||||||
@echo "$$(CC1) <flags> -o $$@ $$<"
|
@echo "$$(CC1) <flags> -o $$@ $$<"
|
||||||
@$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) $$< charmap.txt -i | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
|
@$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) -i $$< charmap.txt | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
|
||||||
else
|
else
|
||||||
@$$(CPP) $$(CPPFLAGS) $$< -o $$(GFLIB_BUILDDIR)/$3.i
|
@$$(CPP) $$(CPPFLAGS) $$< -o $$(GFLIB_BUILDDIR)/$3.i
|
||||||
@$$(PREPROC) $$(GFLIB_BUILDDIR)/$3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $$(GFLIB_BUILDDIR)/$3.s
|
@$$(PREPROC) $$(GFLIB_BUILDDIR)/$3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $$(GFLIB_BUILDDIR)/$3.s
|
||||||
@ -436,11 +366,11 @@ endif
|
|||||||
|
|
||||||
ifeq ($(NODEP),1)
|
ifeq ($(NODEP),1)
|
||||||
$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s
|
$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s
|
||||||
$(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
|
$(PREPROC) $< charmap.txt | $(CPP) -I include - | $(PREPROC) -i $$< charmap.txt | $(AS) $(ASFLAGS) -o $@
|
||||||
else
|
else
|
||||||
define SRC_ASM_DATA_DEP
|
define SRC_ASM_DATA_DEP
|
||||||
$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
|
$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
|
||||||
$$(PREPROC) $$< charmap.txt | $$(CPP) -I include - | $$(AS) $$(ASFLAGS) -o $$@
|
$$(PREPROC) $$< charmap.txt | $$(CPP) -I include - | $$(PREPROC) -ie $$< charmap.txt | $$(AS) $$(ASFLAGS) -o $$@
|
||||||
endef
|
endef
|
||||||
$(foreach src, $(C_ASM_SRCS), $(eval $(call SRC_ASM_DATA_DEP,$(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o, $(src)),$(src))))
|
$(foreach src, $(C_ASM_SRCS), $(eval $(call SRC_ASM_DATA_DEP,$(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o, $(src)),$(src))))
|
||||||
endif
|
endif
|
||||||
@ -458,7 +388,7 @@ endif
|
|||||||
|
|
||||||
ifeq ($(NODEP),1)
|
ifeq ($(NODEP),1)
|
||||||
$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s
|
$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s
|
||||||
$(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
|
$(PREPROC) $< charmap.txt | $(CPP) -I include - | $(PREPROC) -ie $$< charmap.txt | $(AS) $(ASFLAGS) -o $@
|
||||||
else
|
else
|
||||||
$(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call SRC_ASM_DATA_DEP,$(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o, $(src)),$(src))))
|
$(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call SRC_ASM_DATA_DEP,$(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o, $(src)),$(src))))
|
||||||
endif
|
endif
|
||||||
@ -484,17 +414,12 @@ $(DATA_SRC_SUBDIR)/pokemon/teachable_learnsets.h: $(DATA_ASM_BUILDDIR)/event_scr
|
|||||||
define TEST_DEP
|
define TEST_DEP
|
||||||
$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
|
$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
|
||||||
@echo "$$(CC1) <flags> -o $$@ $$<"
|
@echo "$$(CC1) <flags> -o $$@ $$<"
|
||||||
@$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) $$< charmap.txt -i | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
|
@$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) -i $$< charmap.txt | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
|
||||||
endef
|
endef
|
||||||
$(foreach src, $(TEST_SRCS), $(eval $(call TEST_DEP,$(patsubst $(TEST_SUBDIR)/%.c,$(TEST_BUILDDIR)/%.o,$(src)),$(src),$(patsubst $(TEST_SUBDIR)/%.c,%,$(src)))))
|
$(foreach src, $(TEST_SRCS), $(eval $(call TEST_DEP,$(patsubst $(TEST_SUBDIR)/%.c,$(TEST_BUILDDIR)/%.o,$(src)),$(src),$(patsubst $(TEST_SUBDIR)/%.c,%,$(src)))))
|
||||||
|
|
||||||
ifeq ($(MODERN),0)
|
|
||||||
LD_SCRIPT := ld_script.ld
|
|
||||||
LD_SCRIPT_DEPS := $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld
|
|
||||||
else
|
|
||||||
LD_SCRIPT := ld_script_modern.ld
|
LD_SCRIPT := ld_script_modern.ld
|
||||||
LD_SCRIPT_DEPS :=
|
LD_SCRIPT_DEPS :=
|
||||||
endif
|
|
||||||
|
|
||||||
$(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS)
|
$(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS)
|
||||||
cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld
|
cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld
|
||||||
@ -509,7 +434,12 @@ $(ROM): $(ELF)
|
|||||||
$(OBJCOPY) -O binary $< $@
|
$(OBJCOPY) -O binary $< $@
|
||||||
$(FIX) $@ -p --silent
|
$(FIX) $@ -p --silent
|
||||||
|
|
||||||
agbcc: all
|
# Uncomment the next line, and then comment the 4 lines after it to reenable agbcc.
|
||||||
|
#agbcc: all
|
||||||
|
agbcc:
|
||||||
|
@echo "'make agbcc' is deprecated as of pokeemerald-expansion 1.9 and will be removed in 1.10."
|
||||||
|
@echo "Search for 'agbcc: all' in Makefile to reenable agbcc."
|
||||||
|
@exit 1
|
||||||
|
|
||||||
modern: all
|
modern: all
|
||||||
|
|
||||||
@ -536,7 +466,7 @@ check: $(TESTELF)
|
|||||||
$(ROMTESTHYDRA) $(ROMTEST) $(OBJCOPY) $(HEADLESSELF)
|
$(ROMTESTHYDRA) $(ROMTEST) $(OBJCOPY) $(HEADLESSELF)
|
||||||
|
|
||||||
libagbsyscall:
|
libagbsyscall:
|
||||||
@$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
|
@$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=1
|
||||||
|
|
||||||
###################
|
###################
|
||||||
### Symbol file ###
|
### Symbol file ###
|
||||||
|
|||||||
@ -9,7 +9,7 @@ pokeemerald-expansion is a decomp hack base project based off pret's [pokeemeral
|
|||||||
If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect.
|
If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect.
|
||||||
You can phrase it as the following:
|
You can phrase it as the following:
|
||||||
```
|
```
|
||||||
Based off RHH's pokeemerald-expansion v1.8.0 https://github.com/rh-hideout/pokeemerald-expansion/
|
Based off RHH's pokeemerald-expansion 1.9.1 https://github.com/rh-hideout/pokeemerald-expansion/
|
||||||
```
|
```
|
||||||
|
|
||||||
## What features are included?
|
## What features are included?
|
||||||
|
|||||||
@ -315,8 +315,14 @@
|
|||||||
.Lsprite_\@_2:
|
.Lsprite_\@_2:
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro createdragondartsprite anim_battler:req, subpriority_offset:req, argv:vararg
|
.macro jumpifmovetypeequal type:req, jumpInstr:req
|
||||||
.byte 0x33
|
.byte 0x33
|
||||||
|
.byte \type
|
||||||
|
.4byte \jumpInstr
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro createdragondartsprite anim_battler:req, subpriority_offset:req, argv:vararg
|
||||||
|
.byte 0x34
|
||||||
.if \anim_battler == ANIM_TARGET
|
.if \anim_battler == ANIM_TARGET
|
||||||
.byte ANIMSPRITE_IS_TARGET | (\subpriority_offset & 0x7F)
|
.byte ANIMSPRITE_IS_TARGET | (\subpriority_offset & 0x7F)
|
||||||
.else
|
.else
|
||||||
|
|||||||
@ -1652,6 +1652,12 @@
|
|||||||
.4byte \failInstr
|
.4byte \failInstr
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro copyfoesstatincrease battler:req, failInstr:req
|
||||||
|
callnative BS_CopyFoesStatIncrease
|
||||||
|
.byte \battler
|
||||||
|
.4byte \failInstr
|
||||||
|
.endm
|
||||||
|
|
||||||
.macro removeweather
|
.macro removeweather
|
||||||
callnative BS_RemoveWeather
|
callnative BS_RemoveWeather
|
||||||
.endm
|
.endm
|
||||||
@ -1664,6 +1670,10 @@
|
|||||||
callnative BS_DamageToQuarterTargetHP
|
callnative BS_DamageToQuarterTargetHP
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro ficklebeamdamagecalculation
|
||||||
|
callnative BS_FickleBeamDamageCalculation
|
||||||
|
.endm
|
||||||
|
|
||||||
@ various command changed to more readable macros
|
@ various command changed to more readable macros
|
||||||
.macro cancelmultiturnmoves battler:req
|
.macro cancelmultiturnmoves battler:req
|
||||||
various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES
|
various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES
|
||||||
|
|||||||
@ -1798,7 +1798,7 @@
|
|||||||
.4byte \text
|
.4byte \text
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
@ Equivalent to fadescreen but copies gPlttBufferUnfaded to gPaletteDecompressionBuffer on the fade out
|
@ Equivalent to fadescreen but copies gPlttBufferUnfaded to gDecompressionBuffer on the fade out
|
||||||
@ and the reverse on the fade in, in effect saving gPlttBufferUnfaded to restore it.
|
@ and the reverse on the fade in, in effect saving gPlttBufferUnfaded to restore it.
|
||||||
.macro fadescreenswapbuffers mode:req
|
.macro fadescreenswapbuffers mode:req
|
||||||
.byte 0xdc
|
.byte 0xdc
|
||||||
|
|||||||
@ -1 +0,0 @@
|
|||||||
lman
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
gFlashTimeoutFlag
|
|
||||||
PollFlashStatus
|
|
||||||
WaitForFlashWrite
|
|
||||||
ProgramFlashSector
|
|
||||||
gFlash
|
|
||||||
ProgramFlashByte
|
|
||||||
gFlashNumRemainingBytes
|
|
||||||
EraseFlashChip
|
|
||||||
EraseFlashSector
|
|
||||||
gFlashMaxTime
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
gApprenticePartyMovesData
|
|
||||||
gApprenticeQuestionData
|
|
||||||
gApprenticeFunc
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
gMonShrinkDuration
|
|
||||||
gMonShrinkDelta
|
|
||||||
gMonShrinkDistance
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
gBattlerControllerFuncs
|
|
||||||
gBattleControllerData
|
|
||||||
gBattlerControllerEndFuncs
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gFactorySelect_CurrentOptionFunc
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
gPreBattleCallback1
|
|
||||||
gBattleMainFunc
|
|
||||||
gBattleResults
|
|
||||||
gLeveledUpInBattle
|
|
||||||
gHealthboxSpriteIds
|
|
||||||
gMultiUsePlayerCursor
|
|
||||||
gNumberOfMovesToChoose
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gFrontierTempParty
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gInGameOpponentsNo
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gWindowTileAutoAllocEnabled
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gContestRngValue
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
gContestMonPixels
|
|
||||||
gImageProcessingContext
|
|
||||||
gContestPaintingWinner
|
|
||||||
gContestPaintingMonPalette
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gEReaderData
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gCB2_AfterEvolution
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
sPlayerToMewDeltaX
|
|
||||||
sPlayerToMewDeltaY
|
|
||||||
sMewDirectionCandidates
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
gFieldCamera
|
|
||||||
gTotalCameraPixelOffsetY
|
|
||||||
gTotalCameraPixelOffsetX
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gSelectedObjectEvent
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gScrollableMultichoice_ListMenuTemplate
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gBackupMapLayout
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
gCanvasColumnStart
|
|
||||||
gCanvasPixels
|
|
||||||
gCanvasRowEnd
|
|
||||||
gCanvasHeight
|
|
||||||
gCanvasColumnEnd
|
|
||||||
gCanvasRowStart
|
|
||||||
gCanvasMonPersonality
|
|
||||||
gCanvasWidth
|
|
||||||
gCanvasPalette
|
|
||||||
gCanvasPaletteStart
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
gIntroFrameCounter
|
|
||||||
gMultibootProgramStruct
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
gRfuSlotStatusUNI
|
|
||||||
gRfuSlotStatusNI
|
|
||||||
gRfuLinkStatus
|
|
||||||
gRfuStatic
|
|
||||||
gRfuFixed
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gRfuSIO32Id
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gSTWIStatus
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
gLinkPartnersHeldKeys
|
|
||||||
gLinkDebugSeed
|
|
||||||
gLocalLinkPlayerBlock
|
|
||||||
gLinkErrorOccurred
|
|
||||||
gLinkDebugFlags
|
|
||||||
gLinkFiller1
|
|
||||||
gRemoteLinkPlayersNotReceived
|
|
||||||
gBlockReceivedStatus
|
|
||||||
gLinkFiller2
|
|
||||||
gLinkHeldKeys
|
|
||||||
gRecvCmds
|
|
||||||
gLinkStatus
|
|
||||||
gLinkDummy1
|
|
||||||
gLinkDummy2
|
|
||||||
gReadyToExitStandby
|
|
||||||
gReadyToCloseLink
|
|
||||||
gReadyCloseLinkType
|
|
||||||
gSuppressLinkErrorMessage
|
|
||||||
gWirelessCommType
|
|
||||||
gSavedLinkPlayerCount
|
|
||||||
gSendCmd
|
|
||||||
gSavedMultiplayerId
|
|
||||||
gReceivedRemoteLinkPlayers
|
|
||||||
gLinkTestBGInfo
|
|
||||||
gLinkCallback
|
|
||||||
gShouldAdvanceLinkState
|
|
||||||
gLinkTestBlockChecksums
|
|
||||||
gBlockRequestType
|
|
||||||
gLinkFiller3
|
|
||||||
gLinkFiller4
|
|
||||||
gLinkFiller5
|
|
||||||
gLastSendQueueCount
|
|
||||||
gLink
|
|
||||||
gLastRecvQueueCount
|
|
||||||
gLinkSavedIme
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
gRfuAPIBuffer
|
|
||||||
gRfu
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
gListMenuOverride
|
|
||||||
gMultiuseListMenuTemplate
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
gFlashMemoryPresent
|
|
||||||
gSaveBlock1Ptr
|
|
||||||
gSaveBlock2Ptr
|
|
||||||
gPokemonStoragePtr
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
gSoundInfo
|
|
||||||
gPokemonCrySongs
|
|
||||||
gPokemonCryMusicPlayers
|
|
||||||
gMPlayInfo_BGM
|
|
||||||
gMPlayJumpTable
|
|
||||||
gCgbChans
|
|
||||||
gMPlayInfo_SE1
|
|
||||||
gMPlayInfo_SE2
|
|
||||||
gPokemonCryTracks
|
|
||||||
gPokemonCrySong
|
|
||||||
gMPlayMemAccArea
|
|
||||||
gMPlayInfo_SE3
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
gKeyRepeatStartDelay
|
|
||||||
gLinkTransferringData
|
|
||||||
gMain
|
|
||||||
gKeyRepeatContinueDelay
|
|
||||||
gSoftResetDisabled
|
|
||||||
gIntrTable
|
|
||||||
gLinkVSyncDisabled
|
|
||||||
IntrMain_Buffer
|
|
||||||
gPcmDmaCounter
|
|
||||||
gAgbMainLoop_sp
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gBardSong
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
gOverworldTilemapBuffer_Bg2
|
|
||||||
gOverworldTilemapBuffer_Bg1
|
|
||||||
gOverworldTilemapBuffer_Bg3
|
|
||||||
gHeldKeyCodeToSend
|
|
||||||
gFieldCallback
|
|
||||||
gFieldCallback2
|
|
||||||
gLocalLinkPlayerId
|
|
||||||
gFieldLinkPlayerCount
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gItemUseCB
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
gUnusedPokedexU8
|
|
||||||
gPokedexVBlankCB
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gDexCryScreenState
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
gRngValue
|
|
||||||
gRng2Value
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gLocalTime
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
gLastWrittenSector
|
|
||||||
gLastSaveCounter
|
|
||||||
gLastKnownGoodSector
|
|
||||||
gDamagedSaveSectors
|
|
||||||
gSaveCounter
|
|
||||||
gReadWriteSector
|
|
||||||
gIncrementalSectorId
|
|
||||||
gSaveUnusedVar
|
|
||||||
gSaveFileStatus
|
|
||||||
gGameContinueCallback
|
|
||||||
gRamSaveSectorLocations
|
|
||||||
gSaveUnusedVar2
|
|
||||||
gSaveAttemptStatus
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gDisableMusic
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
gOamMatrixAllocBitmap
|
|
||||||
gReservedSpritePaletteCount
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gMenuCallback
|
|
||||||
@ -1 +0,0 @@
|
|||||||
gTasks
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
gFonts
|
|
||||||
gDisableTextPrinters
|
|
||||||
gCurGlyph
|
|
||||||
gTextFlags
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
gWhichTrainerToFaceAfterBattle
|
|
||||||
gPostBattleMovementScript
|
|
||||||
gApproachingTrainers
|
|
||||||
gNoOfApproachingTrainers
|
|
||||||
gTrainerApproachedPlayer
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
sCurTVShowSlot
|
|
||||||
sTV_SecretBaseVisitMovesTemp
|
|
||||||
sTV_DecorationsBuffer
|
|
||||||
sTV_SecretBaseVisitMonsTemp
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
gTransparentTileNumber
|
|
||||||
gWindowBgTilemapBuffers
|
|
||||||
@ -16219,6 +16219,12 @@ Move_RAGING_BULL::
|
|||||||
loadspritegfx ANIM_TAG_IMPACT
|
loadspritegfx ANIM_TAG_IMPACT
|
||||||
loadspritegfx ANIM_TAG_ANGER
|
loadspritegfx ANIM_TAG_ANGER
|
||||||
loadspritegfx ANIM_TAG_BREATH
|
loadspritegfx ANIM_TAG_BREATH
|
||||||
|
loadspritegfx ANIM_TAG_BLUE_LIGHT_WALL
|
||||||
|
loadspritegfx ANIM_TAG_TORN_METAL
|
||||||
|
choosetwoturnanim RagingBullNormal, RagingBullShatteredWall
|
||||||
|
RagingBullNormal:
|
||||||
|
monbg ANIM_TARGET
|
||||||
|
setalpha 12, 8
|
||||||
createsprite gBreathPuffSpriteTemplate, ANIM_ATTACKER, 2
|
createsprite gBreathPuffSpriteTemplate, ANIM_ATTACKER, 2
|
||||||
loopsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 4, 2
|
loopsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 4, 2
|
||||||
createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, -20, -28
|
createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, -20, -28
|
||||||
@ -16250,6 +16256,49 @@ Move_RAGING_BULL::
|
|||||||
waitforvisualfinish
|
waitforvisualfinish
|
||||||
restorebg
|
restorebg
|
||||||
waitbgfadein
|
waitbgfadein
|
||||||
|
clearmonbg ANIM_TARGET
|
||||||
|
end
|
||||||
|
RagingBullShatteredWall:
|
||||||
|
monbg ANIM_TARGET
|
||||||
|
setalpha 12, 8
|
||||||
|
createsprite gBreathPuffSpriteTemplate, ANIM_ATTACKER, 2
|
||||||
|
loopsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 4, 2
|
||||||
|
createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, -20, -28
|
||||||
|
delay 20
|
||||||
|
createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, -28
|
||||||
|
waitforvisualfinish
|
||||||
|
createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4
|
||||||
|
waitforvisualfinish
|
||||||
|
playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER
|
||||||
|
call SetImpactBackground
|
||||||
|
createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4
|
||||||
|
delay 3
|
||||||
|
waitforvisualfinish
|
||||||
|
createsprite gBrickBreakWallSpriteTemplate, ANIM_ATTACKER, 3, ANIM_TARGET, 0, 0, 90, 10
|
||||||
|
playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0
|
||||||
|
createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3
|
||||||
|
delay 20
|
||||||
|
createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0
|
||||||
|
createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
delay 20
|
||||||
|
createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1
|
||||||
|
createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1
|
||||||
|
waitforvisualfinish
|
||||||
|
createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, -8, -12
|
||||||
|
createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 8, -12
|
||||||
|
createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 2, -8, 12
|
||||||
|
createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 3, 8, 12
|
||||||
|
playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET
|
||||||
|
createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5
|
||||||
|
delay 3
|
||||||
|
createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7
|
||||||
|
waitforvisualfinish
|
||||||
|
restorebg
|
||||||
|
waitbgfadein
|
||||||
|
clearmonbg ANIM_TARGET
|
||||||
end
|
end
|
||||||
|
|
||||||
@ Credits to Z-nogyroP. Simple anim that combines Force Palm + Fake Out
|
@ Credits to Z-nogyroP. Simple anim that combines Force Palm + Fake Out
|
||||||
@ -16900,6 +16949,59 @@ ElectroShotUnleash:
|
|||||||
blendoff
|
blendoff
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Move_IVY_CUDGEL::
|
||||||
|
loadspritegfx ANIM_TAG_IVY_CUDGEL_GRASS
|
||||||
|
loadspritegfx ANIM_TAG_WOOD_HAMMER
|
||||||
|
loadspritegfx ANIM_TAG_WOOD_HAMMER_HAMMER
|
||||||
|
loadspritegfx ANIM_TAG_IMPACT
|
||||||
|
playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER
|
||||||
|
createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 2, 4
|
||||||
|
jumpifmovetypeequal TYPE_FIRE, IvyCudgelFire
|
||||||
|
jumpifmovetypeequal TYPE_ROCK, IvyCudgelRock
|
||||||
|
jumpifmovetypeequal TYPE_WATER, IvyCudgelWater
|
||||||
|
createsprite gIvyCudgelSpriteTemplate, ANIM_TARGET, 2
|
||||||
|
delay 60
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4
|
||||||
|
delay 18
|
||||||
|
createvisualtask AnimTask_SquishTarget, 0x2
|
||||||
|
delay 6
|
||||||
|
call WoodHammerImpact
|
||||||
|
waitforvisualfinish
|
||||||
|
end
|
||||||
|
IvyCudgelFire:
|
||||||
|
loadspritegfx ANIM_TAG_IVY_CUDGEL_FIRE
|
||||||
|
createsprite gIvyCudgelFireSpriteTemplate, ANIM_TARGET, 2
|
||||||
|
delay 60
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4
|
||||||
|
delay 18
|
||||||
|
createvisualtask AnimTask_SquishTarget, 0x2
|
||||||
|
delay 6
|
||||||
|
call WoodHammerImpact
|
||||||
|
waitforvisualfinish
|
||||||
|
end
|
||||||
|
IvyCudgelRock:
|
||||||
|
loadspritegfx ANIM_TAG_IVY_CUDGEL_ROCK
|
||||||
|
createsprite gIvyCudgelRockSpriteTemplate, ANIM_TARGET, 2
|
||||||
|
delay 60
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4
|
||||||
|
delay 18
|
||||||
|
createvisualtask AnimTask_SquishTarget, 0x2
|
||||||
|
delay 6
|
||||||
|
call WoodHammerImpact
|
||||||
|
waitforvisualfinish
|
||||||
|
end
|
||||||
|
IvyCudgelWater:
|
||||||
|
loadspritegfx ANIM_TAG_IVY_CUDGEL_WATER
|
||||||
|
createsprite gIvyCudgelWaterSpriteTemplate, ANIM_TARGET, 2
|
||||||
|
delay 60
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4
|
||||||
|
delay 18
|
||||||
|
createvisualtask AnimTask_SquishTarget, 0x2
|
||||||
|
delay 6
|
||||||
|
call WoodHammerImpact
|
||||||
|
waitforvisualfinish
|
||||||
|
end
|
||||||
|
|
||||||
Move_SPICY_EXTRACT::
|
Move_SPICY_EXTRACT::
|
||||||
loadspritegfx ANIM_TAG_SMALL_EMBER
|
loadspritegfx ANIM_TAG_SMALL_EMBER
|
||||||
loadspritegfx ANIM_TAG_POISON_BUBBLE
|
loadspritegfx ANIM_TAG_POISON_BUBBLE
|
||||||
@ -16945,46 +17047,633 @@ Move_SPICY_EXTRACT::
|
|||||||
waitforvisualfinish
|
waitforvisualfinish
|
||||||
end
|
end
|
||||||
|
|
||||||
Move_TERA_BLAST::
|
|
||||||
Move_AXE_KICK::
|
Move_AXE_KICK::
|
||||||
Move_ORDER_UP::
|
loadspritegfx ANIM_TAG_HANDS_AND_FEET
|
||||||
|
loadspritegfx ANIM_TAG_IMPACT
|
||||||
|
playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER
|
||||||
|
createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4
|
||||||
|
delay 7
|
||||||
|
createsprite gAxeKickSpriteTemplate, ANIM_TARGET, 3
|
||||||
|
delay 2
|
||||||
|
playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, ANIM_TARGET, 1
|
||||||
|
createvisualtask AnimTask_SquishTargetShort, 2
|
||||||
|
waitforvisualfinish
|
||||||
|
createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 4
|
||||||
|
end
|
||||||
|
|
||||||
Move_SPIN_OUT::
|
Move_SPIN_OUT::
|
||||||
|
loadspritegfx ANIM_TAG_IMPACT
|
||||||
|
loadspritegfx ANIM_TAG_RAPID_SPIN
|
||||||
|
loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2
|
||||||
|
createvisualtask AnimTask_MetallicShine, 5, 0, 0, RGB_BLACK
|
||||||
|
waitforvisualfinish
|
||||||
|
call SetHighSpeedBg
|
||||||
|
loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 3
|
||||||
|
waitforvisualfinish
|
||||||
|
monbg ANIM_ATTACKER
|
||||||
|
createsprite gRapidSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 32, -32, 40, -2
|
||||||
|
createvisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 0
|
||||||
|
loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4
|
||||||
|
waitforvisualfinish
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2
|
||||||
|
createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 10, 1, 0
|
||||||
|
playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET
|
||||||
|
waitforvisualfinish
|
||||||
|
delay 8
|
||||||
|
createvisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 1
|
||||||
|
loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4
|
||||||
|
waitforvisualfinish
|
||||||
|
call UnsetHighSpeedBg
|
||||||
|
clearmonbg ANIM_ATTACKER
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_MORTAL_SPIN::
|
||||||
|
loadspritegfx ANIM_TAG_IMPACT
|
||||||
|
loadspritegfx ANIM_TAG_RAPID_SPIN
|
||||||
|
loadspritegfx ANIM_TAG_POISON_BUBBLE
|
||||||
|
createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_RAPID_SPIN, 0, 6, 6, RGB(15, 0, 15)
|
||||||
|
monbg ANIM_ATTACKER
|
||||||
|
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 1, 0, 13, RGB(10, 2, 19)
|
||||||
|
delay 16
|
||||||
|
createsprite gRapidSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 32, -32, 40, -2
|
||||||
|
createvisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 0
|
||||||
|
loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4
|
||||||
|
waitforvisualfinish
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2
|
||||||
|
createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 10, 1, 0
|
||||||
|
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 1, 13, 0, RGB(10, 2, 19)
|
||||||
|
call PoisonBubblesEffect
|
||||||
|
waitforvisualfinish
|
||||||
|
delay 8
|
||||||
|
createvisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 1
|
||||||
|
loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4
|
||||||
|
waitforvisualfinish
|
||||||
|
clearmonbg ANIM_ATTACKER
|
||||||
|
blendoff
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_FILLET_AWAY::
|
||||||
|
loadspritegfx ANIM_TAG_CUT
|
||||||
|
createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0
|
||||||
|
playsewithpan SE_M_CUT, SOUND_PAN_ATTACKER
|
||||||
|
delay 5
|
||||||
|
createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 20, -27, 0
|
||||||
|
playsewithpan SE_M_CUT, SOUND_PAN_ATTACKER
|
||||||
|
delay 5
|
||||||
|
createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 60, -37, 0
|
||||||
|
playsewithpan SE_M_CUT, SOUND_PAN_ATTACKER
|
||||||
|
waitforvisualfinish
|
||||||
|
createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, 0x7FFF
|
||||||
|
waitforvisualfinish
|
||||||
|
createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 2, 4, 4
|
||||||
|
waitforvisualfinish
|
||||||
|
createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, 0x7FFF
|
||||||
|
waitforvisualfinish
|
||||||
|
blendoff
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_FLOWER_TRICK::
|
||||||
|
loadspritegfx ANIM_TAG_SPOTLIGHT
|
||||||
|
loadspritegfx ANIM_TAG_LEAF @leaves
|
||||||
|
loadspritegfx ANIM_TAG_FLOWER @flowers
|
||||||
|
loadspritegfx ANIM_TAG_IMPACT
|
||||||
|
createvisualtask AnimTask_CreateSpotlight, 2
|
||||||
|
createvisualtask AnimTask_HardwarePaletteFade, 2, (BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN), 3, 0, 10, FALSE
|
||||||
|
waitforvisualfinish
|
||||||
|
createsprite gSpotlightSpriteTemplate, ANIM_TARGET, 2, 0, -8
|
||||||
|
delay 16
|
||||||
|
createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_ENCORE2, SOUND_PAN_TARGET
|
||||||
|
createvisualtask AnimTask_SwayMon, 5, 1, 8, 1536, 5, ANIM_TARGET
|
||||||
|
waitforvisualfinish
|
||||||
|
playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET
|
||||||
|
createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, 192, 176, 40
|
||||||
|
createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, -192, 240, 40
|
||||||
|
createsprite gTropKickFlowerTemplate, ANIM_TARGET, 1, 0, 10, 192, -160, 40
|
||||||
|
createsprite gTropKickFlowerTemplate, ANIM_TARGET, 1, 0, 10, -192, -112, 40
|
||||||
|
createsprite gTropKickFlowerTemplate, ANIM_TARGET, 1, 0, 10, 160, 48, 40
|
||||||
|
createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, -224, -32, 40
|
||||||
|
createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, 112, -128, 40
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2
|
||||||
|
waitforvisualfinish
|
||||||
|
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1
|
||||||
|
waitforvisualfinish
|
||||||
|
createvisualtask AnimTask_HardwarePaletteFade, 2, (BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN), 3, 10, 0, TRUE
|
||||||
|
createvisualtask AnimTask_RemoveSpotlight, 2
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_MAKE_IT_RAIN::
|
||||||
|
loadspritegfx ANIM_TAG_COIN
|
||||||
|
loadspritegfx ANIM_TAG_IMPACT
|
||||||
|
monbg ANIM_ATTACKER
|
||||||
|
setalpha 12, 8
|
||||||
|
playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER
|
||||||
|
createsprite gCoinThrowSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 1152
|
||||||
|
waitforvisualfinish
|
||||||
|
playsewithpan SE_M_PAY_DAY, SOUND_PAN_TARGET
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, ANIM_TARGET, 2
|
||||||
|
createsprite gFallingCoinSpriteTemplate, ANIM_ATTACKER, 2
|
||||||
|
createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1
|
||||||
|
waitforvisualfinish
|
||||||
|
delay 20
|
||||||
|
createvisualtask AnimTask_IsTargetPlayerSide, 2
|
||||||
|
jumpretfalse MakingItRainOnOpponent
|
||||||
|
jumprettrue MakingItRainOnPlayer
|
||||||
|
MakingItRainContinue:
|
||||||
|
waitbgfadeout
|
||||||
|
createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, 7, 1, 11, 1
|
||||||
|
loopsewithpan SE_M_PAY_DAY, SOUND_PAN_TARGET, 8, 15
|
||||||
|
createsprite gMakingItRainTemplate, ANIM_TARGET, 2, -5, 0, -5, 1
|
||||||
|
delay 2
|
||||||
|
createsprite gMakingItRainTemplate, ANIM_TARGET, 2, 5, 0, 6, 1
|
||||||
|
delay 2
|
||||||
|
createsprite gMakingItRainTemplate, ANIM_TARGET, 2, 19, 0, 10, 1
|
||||||
|
delay 2
|
||||||
|
createsprite gMakingItRainTemplate, ANIM_TARGET, 2, -23, 0, -10, 1
|
||||||
|
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 50, 1
|
||||||
|
createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 5, 50, 1
|
||||||
|
call MakingItRain
|
||||||
|
call MakingItRain
|
||||||
|
call MakingItRain
|
||||||
|
restorebg
|
||||||
|
waitbgfadein
|
||||||
|
blendoff
|
||||||
|
waitforvisualfinish
|
||||||
|
clearmonbg ANIM_ATTACKER
|
||||||
|
end
|
||||||
|
MakingItRainOnOpponent:
|
||||||
|
fadetobg BG_IMPACT_OPPONENT
|
||||||
|
goto MakingItRainContinue
|
||||||
|
MakingItRainOnPlayer:
|
||||||
|
fadetobg BG_IMPACT_PLAYER
|
||||||
|
goto MakingItRainContinue
|
||||||
|
MakingItRain:
|
||||||
|
createsprite gMakingItRainTemplate, ANIM_TARGET, 2, -20, 0, -10, 1
|
||||||
|
delay 2
|
||||||
|
createsprite gMakingItRainTemplate, ANIM_TARGET, 2, 28, 0, 10, 1
|
||||||
|
delay 2
|
||||||
|
createsprite gMakingItRainTemplate, ANIM_TARGET, 2, -10, 0, -5, 1
|
||||||
|
delay 2
|
||||||
|
createsprite gMakingItRainTemplate, ANIM_TARGET, 2, 10, 0, 6, 1
|
||||||
|
delay 2
|
||||||
|
createsprite gMakingItRainTemplate, ANIM_TARGET, 2, 24, 0, 10, 1
|
||||||
|
delay 2
|
||||||
|
createsprite gMakingItRainTemplate, ANIM_TARGET, 2, -32, 0, -10, 1
|
||||||
|
delay 2
|
||||||
|
createsprite gMakingItRainTemplate, ANIM_TARGET, 2, -20, 0, -10, 1
|
||||||
|
delay 2
|
||||||
|
createsprite gMakingItRainTemplate, ANIM_TARGET, 2, 30, 0, 10, 1
|
||||||
|
delay 2
|
||||||
|
return
|
||||||
|
|
||||||
|
Move_SHED_TAIL::
|
||||||
|
loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 24, 3
|
||||||
|
createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 2, 3
|
||||||
|
waitforvisualfinish
|
||||||
|
playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER
|
||||||
|
createvisualtask AnimTask_MonToSubstitute, 2
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_HYPER_DRILL::
|
||||||
|
loadspritegfx ANIM_TAG_IMPACT
|
||||||
|
loadspritegfx ANIM_TAG_HORN_HIT
|
||||||
|
fadetobgfromset BG_GUILLOTINE_OPPONENT, BG_GUILLOTINE_PLAYER, BG_GUILLOTINE_CONTESTS
|
||||||
|
waitbgfadein
|
||||||
|
createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0
|
||||||
|
playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER
|
||||||
|
waitforvisualfinish
|
||||||
|
delay 2
|
||||||
|
createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1
|
||||||
|
createsprite gHornHitSpriteTemplate, ANIM_TARGET, 4, 0, 0, 12
|
||||||
|
waitforvisualfinish
|
||||||
|
playse 20
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 40, 1
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 40, 1
|
||||||
|
createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 3
|
||||||
|
playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET
|
||||||
|
delay 4
|
||||||
|
createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 2, 1, 3
|
||||||
|
playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET
|
||||||
|
delay 4
|
||||||
|
createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -4, 3, 1, 3
|
||||||
|
playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET
|
||||||
|
delay 4
|
||||||
|
createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -8, -5, 1, 3
|
||||||
|
playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET
|
||||||
|
delay 4
|
||||||
|
createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 4, -12, 1, 3
|
||||||
|
playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET
|
||||||
|
delay 4
|
||||||
|
createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 16, 0, 1, 3
|
||||||
|
playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET
|
||||||
|
delay 4
|
||||||
|
createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 5, 18, 1, 3
|
||||||
|
playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET
|
||||||
|
delay 4
|
||||||
|
createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -17, 12, 1, 2
|
||||||
|
playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET
|
||||||
|
delay 4
|
||||||
|
createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -21, -15, 1, 2
|
||||||
|
playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET
|
||||||
|
delay 4
|
||||||
|
createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, -27, 1, 2
|
||||||
|
playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET
|
||||||
|
delay 4
|
||||||
|
createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 0, 1, 2
|
||||||
|
playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET
|
||||||
|
delay 4
|
||||||
|
createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2
|
||||||
|
createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0
|
||||||
|
playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET
|
||||||
|
waitforvisualfinish
|
||||||
|
createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0
|
||||||
|
restorebg
|
||||||
|
waitbgfadein
|
||||||
|
blendoff
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_TWIN_BEAM::
|
||||||
|
loadspritegfx ANIM_TAG_BLUE_RING
|
||||||
|
loadspritegfx ANIM_TAG_GOLD_RING
|
||||||
|
playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER
|
||||||
|
call SetPsychicBackground
|
||||||
|
createvisualtask AnimTask_StartSinAnimTimer, 5, 100
|
||||||
|
createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_TELEPORT, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 9, 0, 10
|
||||||
|
call PsywaveRings
|
||||||
|
call PsybeamRings
|
||||||
|
call PsywaveRings
|
||||||
|
call PsybeamRings
|
||||||
|
createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 4, 0, 12, RGB(31, 18, 31)
|
||||||
|
call PsywaveRings
|
||||||
|
call PsybeamRings
|
||||||
|
call PsywaveRings
|
||||||
|
call PsybeamRings
|
||||||
|
call PsywaveRings
|
||||||
|
call PsybeamRings
|
||||||
|
call PsywaveRings
|
||||||
|
call PsybeamRings
|
||||||
|
waitforvisualfinish
|
||||||
|
delay 1
|
||||||
|
call UnsetPsychicBg
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_COMEUPPANCE::
|
||||||
|
loadspritegfx ANIM_TAG_IMPACT
|
||||||
|
monbg ANIM_TARGET
|
||||||
|
fadetobg BG_DARK
|
||||||
|
waitbgfadein
|
||||||
|
delay 0
|
||||||
|
playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER
|
||||||
|
createvisualtask AnimTask_ShakeMon2, 5, ANIM_ATTACKER, 1, 0, 15, 1
|
||||||
|
createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 0, 9, RGB_RED
|
||||||
|
waitforvisualfinish
|
||||||
|
delay 10
|
||||||
|
createvisualtask AnimTask_SwayMon, 5, 0, 16, 6144, 8, ANIM_ATTACKER
|
||||||
|
delay 5
|
||||||
|
setalpha 12, 8
|
||||||
|
createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 30, 1
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0
|
||||||
|
playsewithpan SE_M_COMET_PUNCH, +63
|
||||||
|
delay 5
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, 1, 0
|
||||||
|
playsewithpan SE_M_COMET_PUNCH, +63
|
||||||
|
delay 5
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, 1, 0
|
||||||
|
playsewithpan SE_M_COMET_PUNCH, +63
|
||||||
|
delay 5
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, 1, 0
|
||||||
|
playsewithpan SE_M_COMET_PUNCH, +63
|
||||||
|
delay 5
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, 1, 0
|
||||||
|
playsewithpan SE_M_COMET_PUNCH, +63
|
||||||
|
delay 5
|
||||||
|
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, 1, 0
|
||||||
|
playsewithpan SE_M_COMET_PUNCH, +63
|
||||||
|
waitforvisualfinish
|
||||||
|
clearmonbg ANIM_TARGET
|
||||||
|
blendoff
|
||||||
|
restorebg
|
||||||
|
waitbgfadein
|
||||||
|
createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 9, 0, RGB_RED
|
||||||
|
waitforvisualfinish
|
||||||
|
clearmonbg ANIM_DEF_PARTNER
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_BLOOD_MOON::
|
||||||
|
loadspritegfx ANIM_TAG_BLOOD_MOON
|
||||||
|
loadspritegfx ANIM_TAG_BEAM
|
||||||
|
loadspritegfx ANIM_TAG_RED_EXPLOSION
|
||||||
|
createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_BG, 0, 16, 16, RGB_BLACK
|
||||||
|
createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 8, 1, ANIM_ATTACKER
|
||||||
|
delay 8
|
||||||
|
playsewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER
|
||||||
|
createsprite gMoonUpSpriteTemplate, ANIM_ATTACKER, 2
|
||||||
|
waitforvisualfinish
|
||||||
|
delay 15
|
||||||
|
playsewithpan SE_M_DETECT, 0
|
||||||
|
waitforvisualfinish
|
||||||
|
createvisualtask AnimTask_IsTargetPlayerSide, 2
|
||||||
|
jumpargeq 7 ANIM_TARGET BloodMoonOnPlayer
|
||||||
|
BloodMoonOnOpponent:
|
||||||
|
createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 10, 0, 5
|
||||||
|
call BloodMoonOnslaughtOpponent
|
||||||
|
call BloodMoonOnslaughtOpponent
|
||||||
|
call BloodMoonOnslaughtOpponent
|
||||||
|
call BloodMoonOnslaughtOpponent
|
||||||
|
call BloodMoonOnslaughtOpponent
|
||||||
|
createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 140, -16, 165, 40, 4
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 1, 0
|
||||||
|
delay 0
|
||||||
|
waitforvisualfinish
|
||||||
|
goto BloodMoonFinish
|
||||||
|
BloodMoonOnPlayer:
|
||||||
|
createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 10, 0, 5
|
||||||
|
call BloodMoonOnslaughtPlayer
|
||||||
|
call BloodMoonOnslaughtPlayer
|
||||||
|
call BloodMoonOnslaughtPlayer
|
||||||
|
call BloodMoonOnslaughtPlayer
|
||||||
|
call BloodMoonOnslaughtPlayer
|
||||||
|
createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 40, -16, 75, 80, 4
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
delay 0
|
||||||
|
waitforvisualfinish
|
||||||
|
BloodMoonFinish:
|
||||||
|
createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_BG, 0, 0, 0, RGB_BLACK
|
||||||
|
waitforvisualfinish
|
||||||
|
clearmonbg ANIM_ATTACKER
|
||||||
|
end
|
||||||
|
BloodMoonOnslaughtOpponent:
|
||||||
|
createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 140, -16, 165, 40, 4
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 1, 0
|
||||||
|
delay 0
|
||||||
|
createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 140, -16, 165, 40, 4
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, -16, -15, 1, 0
|
||||||
|
delay 0
|
||||||
|
createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 140, -16, 165, 40, 4
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 16, -5, 1, 0
|
||||||
|
delay 0
|
||||||
|
createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 140, -16, 165, 40, 4
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, -12, 18, 1, 0
|
||||||
|
delay 0
|
||||||
|
createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 140, -16, 165, 40, 4
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 1, 0
|
||||||
|
delay 0
|
||||||
|
return
|
||||||
|
BloodMoonOnslaughtPlayer:
|
||||||
|
createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 40, -16, 75, 80, 4
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 1, 0
|
||||||
|
delay 0
|
||||||
|
createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 40, -16, 75, 80, 4
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, -16, -15, 1, 0
|
||||||
|
delay 0
|
||||||
|
createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 40, -16, 75, 80, 4
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 16, -5, 1, 0
|
||||||
|
delay 0
|
||||||
|
createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 40, -16, 75, 80, 4
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, -12, 18, 1, 0
|
||||||
|
delay 0
|
||||||
|
createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 40, -16, 75, 80, 4
|
||||||
|
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1
|
||||||
|
createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 1, 0
|
||||||
|
delay 0
|
||||||
|
return
|
||||||
|
|
||||||
|
Move_FICKLE_BEAM::
|
||||||
|
createvisualtask AnimTask_IsPowerOver99, 2
|
||||||
|
waitforvisualfinish
|
||||||
|
jumpreteq FALSE, FickleBeamRegular
|
||||||
|
jumpreteq TRUE, FickleBeamIntense
|
||||||
|
FickleBeamRegular:
|
||||||
|
loadspritegfx ANIM_TAG_GOLD_RING
|
||||||
|
playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER
|
||||||
|
createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 3, 4, 0, 15
|
||||||
|
call PsybeamRings
|
||||||
|
call PsybeamRings
|
||||||
|
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 25, 1
|
||||||
|
createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(15, 8, 30)
|
||||||
|
call PsybeamRings
|
||||||
|
call PsybeamRings
|
||||||
|
call PsybeamRings
|
||||||
|
call PsybeamRings
|
||||||
|
call PsybeamRings
|
||||||
|
call PsybeamRings
|
||||||
|
call PsybeamRings
|
||||||
|
call PsybeamRings
|
||||||
|
call PsybeamRings
|
||||||
|
waitforvisualfinish
|
||||||
|
end
|
||||||
|
FickleBeamIntense:
|
||||||
|
loadspritegfx ANIM_TAG_ORBS
|
||||||
|
fadetobgfromset BG_SPACIAL_REND_ON_OPPONENT BG_SPACIAL_REND_ON_PLAYER BG_SPACIAL_REND_ON_OPPONENT
|
||||||
|
waitbgfadein
|
||||||
|
delay 10
|
||||||
|
playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_ATTACKER
|
||||||
|
createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 4, 1
|
||||||
|
waitforvisualfinish
|
||||||
|
delay 30
|
||||||
|
createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 15, 0, 5
|
||||||
|
createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1
|
||||||
|
createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB_RED, 16, 0, 0
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
call HyperBeamOrbs
|
||||||
|
waitforvisualfinish
|
||||||
|
restorebg
|
||||||
|
waitbgfadein
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_THUNDERCLAP::
|
||||||
|
loadspritegfx ANIM_TAG_LIGHTNING
|
||||||
|
monbg ANIM_ATK_PARTNER
|
||||||
|
setalpha 12, 8
|
||||||
|
createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5
|
||||||
|
createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 7, 3
|
||||||
|
playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER
|
||||||
|
delay 4
|
||||||
|
playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET
|
||||||
|
delay 1
|
||||||
|
createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -32
|
||||||
|
playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET
|
||||||
|
delay 1
|
||||||
|
createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16
|
||||||
|
delay 1
|
||||||
|
createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 0
|
||||||
|
delay 1
|
||||||
|
createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16
|
||||||
|
delay 10
|
||||||
|
createvisualtask AnimTask_ShakeTargetInPattern, 2, 30, 3, TRUE, 0
|
||||||
|
delay 2
|
||||||
|
createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_BG, 3, 16, 0, RGB_WHITE
|
||||||
|
createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 16, 16, RGB_BLACK
|
||||||
|
delay 4
|
||||||
|
createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 0, 0, RGB_BLACK
|
||||||
|
waitforvisualfinish
|
||||||
|
clearmonbg ANIM_ATK_PARTNER
|
||||||
|
blendoff
|
||||||
|
waitforvisualfinish
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_HARD_PRESS::
|
||||||
|
loadspritegfx ANIM_TAG_EXPLOSION
|
||||||
|
loadspritegfx ANIM_TAG_ACUPRESSURE
|
||||||
|
loadspritegfx ANIM_TAG_PURPLE_HAND_OUTLINE
|
||||||
|
setalpha 15, 0
|
||||||
|
call SetSteelBeamBackground
|
||||||
|
createvisualtask AnimTask_CompressTargetHorizontallyFast, 2
|
||||||
|
createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0, 0, 1, 1
|
||||||
|
delay 3
|
||||||
|
playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER
|
||||||
|
createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 24, -24, 1, 1
|
||||||
|
delay 3
|
||||||
|
playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER
|
||||||
|
createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, -16, 16, 1, 1
|
||||||
|
delay 3
|
||||||
|
playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER
|
||||||
|
createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, -24, -12, 1, 1
|
||||||
|
delay 3
|
||||||
|
playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER
|
||||||
|
createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 16, 16, 1, 1
|
||||||
|
waitforvisualfinish
|
||||||
|
blendoff
|
||||||
|
call UnsetHighSpeedBg
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_DRAGON_CHEER::
|
||||||
|
loadspritegfx ANIM_TAG_NOISE_LINE
|
||||||
|
loadspritegfx ANIM_TAG_CONFETTI
|
||||||
|
loadspritegfx ANIM_TAG_PINK_CLOUD
|
||||||
|
createvisualtask AnimTask_DeepInhale, 2, ANIM_ATTACKER
|
||||||
|
delay 12
|
||||||
|
call RoarEffect
|
||||||
|
createvisualtask SoundTask_PlayCryHighPitch, 2, ANIM_ATTACKER, 3
|
||||||
|
waitforvisualfinish
|
||||||
|
monbg ANIM_ATTACKER
|
||||||
|
playsewithpan SE_BALL_OPEN, SOUND_PAN_TARGET
|
||||||
|
createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 122, 3, -14, 18, 24
|
||||||
|
createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 121, 3, 14, 6, 24
|
||||||
|
createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 120, 3, -12, 12, 24
|
||||||
|
createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 119, 3, 14, 18, 24
|
||||||
|
createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 118, 3, 0, 0, 24
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
call CreateFlatterConfetti
|
||||||
|
waitforvisualfinish
|
||||||
|
clearmonbg ANIM_ATTACKER
|
||||||
|
delay 10
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_MALIGNANT_CHAIN::
|
||||||
|
loadspritegfx ANIM_TAG_PURPLE_CHAIN
|
||||||
|
loadspritegfx ANIM_TAG_POISON_BUBBLE
|
||||||
|
loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 6, 2
|
||||||
|
createsprite gChainBindingSpriteTemplate, ANIM_TARGET, 4, 0, 16, 0, 1
|
||||||
|
delay 7
|
||||||
|
createsprite gChainBindingSpriteTemplate, ANIM_TARGET, 2, 0, 8, 1, 1
|
||||||
|
delay 3
|
||||||
|
createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1
|
||||||
|
delay 20
|
||||||
|
setarg 7, -1
|
||||||
|
playsewithpan SE_M_BIND, SOUND_PAN_TARGET
|
||||||
|
waitforvisualfinish
|
||||||
|
call PoisonBubblesEffect
|
||||||
|
waitforvisualfinish
|
||||||
|
end
|
||||||
|
|
||||||
Move_POPULATION_BOMB::
|
Move_POPULATION_BOMB::
|
||||||
|
loadspritegfx ANIM_TAG_CUT
|
||||||
|
monbg ANIM_TARGET
|
||||||
|
setalpha 12, 8
|
||||||
|
playsewithpan SE_M_CUT, SOUND_PAN_TARGET
|
||||||
|
createvisualtask AnimTask_RandomBool, 2
|
||||||
|
jumpretfalse PopulationBombSliceRight
|
||||||
|
jumprettrue PopulationBombSliceLeft
|
||||||
|
PopulationBombSliceRight:
|
||||||
|
createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0
|
||||||
|
goto PopulationBombContinue
|
||||||
|
PopulationBombSliceLeft:
|
||||||
|
createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 1
|
||||||
|
PopulationBombContinue:
|
||||||
|
delay 5
|
||||||
|
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1
|
||||||
|
waitforvisualfinish
|
||||||
|
clearmonbg ANIM_TARGET
|
||||||
|
blendoff
|
||||||
|
waitforvisualfinish
|
||||||
|
end
|
||||||
|
|
||||||
|
Move_TERA_BLAST::
|
||||||
|
Move_ORDER_UP::
|
||||||
Move_GLAIVE_RUSH::
|
Move_GLAIVE_RUSH::
|
||||||
Move_REVIVAL_BLESSING::
|
Move_REVIVAL_BLESSING::
|
||||||
Move_SALT_CURE::
|
Move_SALT_CURE::
|
||||||
Move_TRIPLE_DIVE::
|
Move_TRIPLE_DIVE::
|
||||||
Move_MORTAL_SPIN::
|
|
||||||
Move_DOODLE::
|
Move_DOODLE::
|
||||||
Move_FILLET_AWAY::
|
|
||||||
Move_FLOWER_TRICK::
|
|
||||||
Move_MAKE_IT_RAIN::
|
|
||||||
Move_RUINATION::
|
Move_RUINATION::
|
||||||
Move_COLLISION_COURSE::
|
Move_COLLISION_COURSE::
|
||||||
Move_ELECTRO_DRIFT::
|
Move_ELECTRO_DRIFT::
|
||||||
Move_SHED_TAIL::
|
|
||||||
Move_HYPER_DRILL::
|
|
||||||
Move_TWIN_BEAM::
|
|
||||||
Move_ARMOR_CANNON::
|
Move_ARMOR_CANNON::
|
||||||
Move_COMEUPPANCE::
|
|
||||||
Move_BLAZING_TORQUE::
|
Move_BLAZING_TORQUE::
|
||||||
Move_WICKED_TORQUE::
|
Move_WICKED_TORQUE::
|
||||||
Move_NOXIOUS_TORQUE::
|
Move_NOXIOUS_TORQUE::
|
||||||
Move_COMBAT_TORQUE::
|
Move_COMBAT_TORQUE::
|
||||||
Move_MAGICAL_TORQUE::
|
Move_MAGICAL_TORQUE::
|
||||||
Move_PSYBLADE::
|
Move_PSYBLADE::
|
||||||
Move_BLOOD_MOON::
|
|
||||||
Move_MATCHA_GOTCHA::
|
Move_MATCHA_GOTCHA::
|
||||||
Move_IVY_CUDGEL::
|
|
||||||
Move_TERA_STARSTORM::
|
Move_TERA_STARSTORM::
|
||||||
Move_FICKLE_BEAM::
|
|
||||||
Move_THUNDERCLAP::
|
|
||||||
Move_MIGHTY_CLEAVE::
|
Move_MIGHTY_CLEAVE::
|
||||||
Move_TACHYON_CUTTER::
|
Move_TACHYON_CUTTER::
|
||||||
Move_HARD_PRESS::
|
|
||||||
Move_DRAGON_CHEER::
|
|
||||||
Move_SUPERCELL_SLAM::
|
Move_SUPERCELL_SLAM::
|
||||||
Move_MALIGNANT_CHAIN::
|
|
||||||
end @to do
|
end @to do
|
||||||
|
|
||||||
@@@@@@@@@@@@@@@@@@@@@@@ GEN 1-3 @@@@@@@@@@@@@@@@@@@@@@@
|
@@@@@@@@@@@@@@@@@@@@@@@ GEN 1-3 @@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
|||||||
@ -30,6 +30,19 @@ BattleScript_DamageToQuarterTargetHP::
|
|||||||
damagetoquartertargethp
|
damagetoquartertargethp
|
||||||
goto BattleScript_HitFromAtkAnimation
|
goto BattleScript_HitFromAtkAnimation
|
||||||
|
|
||||||
|
BattleScript_EffectFickleBeam::
|
||||||
|
attackcanceler
|
||||||
|
attackstring
|
||||||
|
ppreduce
|
||||||
|
accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE
|
||||||
|
ficklebeamdamagecalculation
|
||||||
|
goto BattleScript_HitFromCritCalc
|
||||||
|
BattleScript_FickleBeamDoubled::
|
||||||
|
pause B_WAIT_TIME_SHORTEST
|
||||||
|
printstring STRINGID_FICKLEBEAMDOUBLED
|
||||||
|
waitmessage B_WAIT_TIME_LONG
|
||||||
|
goto BattleScript_HitFromCritCalc
|
||||||
|
|
||||||
BattleScript_Terastallization::
|
BattleScript_Terastallization::
|
||||||
@ TODO: no string prints in S/V, but right now this helps with clarity
|
@ TODO: no string prints in S/V, but right now this helps with clarity
|
||||||
printstring STRINGID_PKMNSTORINGENERGY
|
printstring STRINGID_PKMNSTORINGENERGY
|
||||||
@ -565,7 +578,7 @@ BattleScript_Teatimerod:
|
|||||||
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer
|
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer
|
||||||
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer
|
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer
|
||||||
printfromtable gStatUpStringIds
|
printfromtable gStatUpStringIds
|
||||||
waitmessage 0x40
|
waitmessage B_WAIT_TIME_LONG
|
||||||
moveendto MOVEEND_NEXT_TARGET
|
moveendto MOVEEND_NEXT_TARGET
|
||||||
jumpifnexttargetvalid BattleScript_TeatimeLoop
|
jumpifnexttargetvalid BattleScript_TeatimeLoop
|
||||||
moveendcase MOVEEND_CLEAR_BITS
|
moveendcase MOVEEND_CLEAR_BITS
|
||||||
@ -577,7 +590,7 @@ BattleScript_Teatimemotor:
|
|||||||
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer
|
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer
|
||||||
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer
|
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer
|
||||||
printfromtable gStatUpStringIds
|
printfromtable gStatUpStringIds
|
||||||
waitmessage 0x40
|
waitmessage B_WAIT_TIME_LONG
|
||||||
moveendto MOVEEND_NEXT_TARGET
|
moveendto MOVEEND_NEXT_TARGET
|
||||||
jumpifnexttargetvalid BattleScript_TeatimeLoop
|
jumpifnexttargetvalid BattleScript_TeatimeLoop
|
||||||
moveendcase MOVEEND_CLEAR_BITS
|
moveendcase MOVEEND_CLEAR_BITS
|
||||||
@ -853,13 +866,11 @@ BattleScript_OctolockEndTurn::
|
|||||||
playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_NEGATIVE
|
playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_NEGATIVE
|
||||||
setstatchanger STAT_DEF, 1, TRUE
|
setstatchanger STAT_DEF, 1, TRUE
|
||||||
statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctolockTryLowerSpDef
|
statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctolockTryLowerSpDef
|
||||||
BattleScript_OctolockTryLowerDef:
|
|
||||||
printfromtable gStatDownStringIds
|
printfromtable gStatDownStringIds
|
||||||
waitmessage B_WAIT_TIME_LONG
|
waitmessage B_WAIT_TIME_LONG
|
||||||
BattleScript_OctolockTryLowerSpDef:
|
BattleScript_OctolockTryLowerSpDef:
|
||||||
setstatchanger STAT_SPDEF, 1, TRUE
|
setstatchanger STAT_SPDEF, 1, TRUE
|
||||||
statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctlockTurnDmgEnd
|
statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctlockTurnDmgEnd
|
||||||
BattleScript_OctolockTurnDmgPrintMsg:
|
|
||||||
printfromtable gStatDownStringIds
|
printfromtable gStatDownStringIds
|
||||||
waitmessage B_WAIT_TIME_LONG
|
waitmessage B_WAIT_TIME_LONG
|
||||||
BattleScript_OctlockTurnDmgEnd:
|
BattleScript_OctlockTurnDmgEnd:
|
||||||
@ -867,6 +878,7 @@ BattleScript_OctlockTurnDmgEnd:
|
|||||||
|
|
||||||
BattleScript_EffectPoltergeist::
|
BattleScript_EffectPoltergeist::
|
||||||
attackcanceler
|
attackcanceler
|
||||||
|
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||||
attackstring
|
attackstring
|
||||||
ppreduce
|
ppreduce
|
||||||
checkpoltergeist BS_TARGET, BattleScript_ButItFailed
|
checkpoltergeist BS_TARGET, BattleScript_ButItFailed
|
||||||
@ -916,19 +928,10 @@ BattleScript_BothCanNoLongerEscape::
|
|||||||
return
|
return
|
||||||
|
|
||||||
BattleScript_EffectHyperspaceFury::
|
BattleScript_EffectHyperspaceFury::
|
||||||
jumpifspecies BS_ATTACKER, SPECIES_HOOPA_UNBOUND, BattleScript_EffectHyperspaceFuryUnbound
|
jumpifspecies BS_ATTACKER, SPECIES_HOOPA_UNBOUND, BattleScript_EffectHit
|
||||||
jumpifspecies BS_ATTACKER, SPECIES_HOOPA_CONFINED, BattleScript_ButHoopaCantUseIt
|
jumpifspecies BS_ATTACKER, SPECIES_HOOPA_CONFINED, BattleScript_ButHoopaCantUseIt
|
||||||
goto BattleScript_PokemonCantUseTheMove
|
goto BattleScript_PokemonCantUseTheMove
|
||||||
|
|
||||||
BattleScript_EffectHyperspaceFuryUnbound::
|
|
||||||
attackcanceler
|
|
||||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
|
||||||
attackstring
|
|
||||||
pause B_WAIT_TIME_LONG
|
|
||||||
ppreduce
|
|
||||||
seteffectprimary MOVE_EFFECT_FEINT
|
|
||||||
goto BattleScript_HitFromCritCalc
|
|
||||||
|
|
||||||
BattleScript_ButHoopaCantUseIt:
|
BattleScript_ButHoopaCantUseIt:
|
||||||
printstring STRINGID_BUTHOOPACANTUSEIT
|
printstring STRINGID_BUTHOOPACANTUSEIT
|
||||||
waitmessage B_WAIT_TIME_LONG
|
waitmessage B_WAIT_TIME_LONG
|
||||||
@ -999,7 +1002,6 @@ BattleScript_EffectStuffCheeks::
|
|||||||
jumpifnotberry BS_ATTACKER, BattleScript_ButItFailed
|
jumpifnotberry BS_ATTACKER, BattleScript_ButItFailed
|
||||||
attackanimation
|
attackanimation
|
||||||
waitanimation
|
waitanimation
|
||||||
BattleScript_StuffCheeksEatBerry:
|
|
||||||
setbyte sBERRY_OVERRIDE, 1
|
setbyte sBERRY_OVERRIDE, 1
|
||||||
orword gHitMarker, HITMARKER_DISABLE_ANIMATION
|
orword gHitMarker, HITMARKER_DISABLE_ANIMATION
|
||||||
consumeberry BS_ATTACKER, TRUE
|
consumeberry BS_ATTACKER, TRUE
|
||||||
@ -1211,10 +1213,6 @@ BattleScript_StrengthSapLower:
|
|||||||
waitmessage B_WAIT_TIME_LONG
|
waitmessage B_WAIT_TIME_LONG
|
||||||
goto BattleScript_StrengthSapHp
|
goto BattleScript_StrengthSapHp
|
||||||
@ Drain HP without lowering a stat
|
@ Drain HP without lowering a stat
|
||||||
BattleScript_StrengthSapTryHp:
|
|
||||||
jumpiffullhp BS_ATTACKER, BattleScript_ButItFailed
|
|
||||||
attackanimation
|
|
||||||
waitanimation
|
|
||||||
BattleScript_StrengthSapHp:
|
BattleScript_StrengthSapHp:
|
||||||
jumpifability BS_TARGET, ABILITY_LIQUID_OOZE, BattleScript_StrengthSapManipulateDmg
|
jumpifability BS_TARGET, ABILITY_LIQUID_OOZE, BattleScript_StrengthSapManipulateDmg
|
||||||
jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_MoveEnd
|
jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_MoveEnd
|
||||||
@ -1345,8 +1343,6 @@ BattleScript_EffectPartingShotTrySpAtk:
|
|||||||
BattleScript_EffectPartingShotSwitch:
|
BattleScript_EffectPartingShotSwitch:
|
||||||
moveendall
|
moveendall
|
||||||
goto BattleScript_MoveSwitch
|
goto BattleScript_MoveSwitch
|
||||||
BattleScript_PartingShotEnd:
|
|
||||||
end
|
|
||||||
|
|
||||||
BattleScript_EffectPowder::
|
BattleScript_EffectPowder::
|
||||||
attackcanceler
|
attackcanceler
|
||||||
@ -1549,7 +1545,6 @@ BattleScript_RototillerLoop:
|
|||||||
jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_RototillerCantRaiseMultipleStats
|
jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_RototillerCantRaiseMultipleStats
|
||||||
BattleScript_RototillerCheckAffected:
|
BattleScript_RototillerCheckAffected:
|
||||||
jumpifnotrototilleraffected BS_TARGET, BattleScript_RototillerNoEffect
|
jumpifnotrototilleraffected BS_TARGET, BattleScript_RototillerNoEffect
|
||||||
BattleScript_RototillerAffected:
|
|
||||||
setbyte sSTAT_ANIM_PLAYED, FALSE
|
setbyte sSTAT_ANIM_PLAYED, FALSE
|
||||||
playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, 0
|
playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, 0
|
||||||
setstatchanger STAT_ATK, 1, FALSE
|
setstatchanger STAT_ATK, 1, FALSE
|
||||||
@ -1780,7 +1775,6 @@ BattleScript_EffectAutotomize::
|
|||||||
BattleScript_AutotomizeAttackAnim::
|
BattleScript_AutotomizeAttackAnim::
|
||||||
attackanimation
|
attackanimation
|
||||||
waitanimation
|
waitanimation
|
||||||
BattleScript_AutotomizeDoAnim::
|
|
||||||
setgraphicalstatchangevalues
|
setgraphicalstatchangevalues
|
||||||
playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
|
playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
|
||||||
BattleScript_AutotomizePrintString::
|
BattleScript_AutotomizePrintString::
|
||||||
@ -2691,7 +2685,6 @@ BattleScript_TryTailwindAbilitiesLoop_Iter:
|
|||||||
BattleScript_TryTailwindAbilitiesLoop_Increment:
|
BattleScript_TryTailwindAbilitiesLoop_Increment:
|
||||||
addbyte gBattlerTarget, 0x1
|
addbyte gBattlerTarget, 0x1
|
||||||
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_TryTailwindAbilitiesLoop_Iter
|
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_TryTailwindAbilitiesLoop_Iter
|
||||||
BattleScript_TryTailwindAbilitiesLoop_Ret:
|
|
||||||
restoretarget
|
restoretarget
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -2792,7 +2785,6 @@ BattleScript_EffectPlaceholder::
|
|||||||
goto BattleScript_MoveEnd
|
goto BattleScript_MoveEnd
|
||||||
|
|
||||||
BattleScript_EffectHit::
|
BattleScript_EffectHit::
|
||||||
BattleScript_HitFromAtkCanceler::
|
|
||||||
attackcanceler
|
attackcanceler
|
||||||
BattleScript_HitFromAccCheck::
|
BattleScript_HitFromAccCheck::
|
||||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||||
@ -3285,14 +3277,6 @@ BattleScript_RoarBlockedByDynamax:
|
|||||||
waitmessage B_WAIT_TIME_LONG
|
waitmessage B_WAIT_TIME_LONG
|
||||||
goto BattleScript_MoveEnd
|
goto BattleScript_MoveEnd
|
||||||
|
|
||||||
BattleScript_EffectMultiHit::
|
|
||||||
attackcanceler
|
|
||||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
|
||||||
attackstring
|
|
||||||
ppreduce
|
|
||||||
setmultihitcounter 0
|
|
||||||
initmultihitstring
|
|
||||||
sethword sMULTIHIT_EFFECT, 0
|
|
||||||
BattleScript_MultiHitLoop::
|
BattleScript_MultiHitLoop::
|
||||||
jumpifhasnohp BS_ATTACKER, BattleScript_MultiHitEnd
|
jumpifhasnohp BS_ATTACKER, BattleScript_MultiHitEnd
|
||||||
jumpifhasnohp BS_TARGET, BattleScript_MultiHitPrintStrings
|
jumpifhasnohp BS_TARGET, BattleScript_MultiHitPrintStrings
|
||||||
@ -3705,7 +3689,6 @@ BattleScript_EffectParalyze::
|
|||||||
jumpifshieldsdown BS_TARGET, BattleScript_AbilityProtectsDoesntAffect
|
jumpifshieldsdown BS_TARGET, BattleScript_AbilityProtectsDoesntAffect
|
||||||
jumpifsubstituteblocks BattleScript_ButItFailed
|
jumpifsubstituteblocks BattleScript_ButItFailed
|
||||||
typecalc
|
typecalc
|
||||||
BattleScript_BattleScript_EffectParalyzeNoTypeCalc:
|
|
||||||
jumpifmovehadnoeffect BattleScript_ButItFailed
|
jumpifmovehadnoeffect BattleScript_ButItFailed
|
||||||
jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed
|
jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed
|
||||||
jumpifelectricabilityaffected BS_TARGET, ABILITY_VOLT_ABSORB, BattleScript_VoltAbsorbHeal
|
jumpifelectricabilityaffected BS_TARGET, ABILITY_VOLT_ABSORB, BattleScript_VoltAbsorbHeal
|
||||||
@ -4632,7 +4615,6 @@ BattleScript_EffectTeleport::
|
|||||||
.else
|
.else
|
||||||
jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_FailedFromAtkCanceler
|
jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_FailedFromAtkCanceler
|
||||||
.endif
|
.endif
|
||||||
BattleScript_EffectTeleportTryToRunAway:
|
|
||||||
attackcanceler
|
attackcanceler
|
||||||
attackstring
|
attackstring
|
||||||
ppreduce
|
ppreduce
|
||||||
@ -6379,6 +6361,7 @@ BattleScript_StickyWebOnSwitchInPrintStatMsg:
|
|||||||
BattleScript_StickyWebOnSwitchInEnd:
|
BattleScript_StickyWebOnSwitchInEnd:
|
||||||
restoretarget
|
restoretarget
|
||||||
restoreattacker
|
restoreattacker
|
||||||
|
setbyte sSTICKY_WEB_STAT_DROP, 0
|
||||||
return
|
return
|
||||||
|
|
||||||
BattleScript_PerishSongTakesLife::
|
BattleScript_PerishSongTakesLife::
|
||||||
@ -6501,7 +6484,6 @@ BattleScript_WindPowerActivates::
|
|||||||
setcharge BS_TARGET
|
setcharge BS_TARGET
|
||||||
printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER
|
printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER
|
||||||
waitmessage B_WAIT_TIME_LONG
|
waitmessage B_WAIT_TIME_LONG
|
||||||
BattleScript_WindPowerActivates_Ret:
|
|
||||||
return
|
return
|
||||||
|
|
||||||
BattleScript_ToxicDebrisActivates::
|
BattleScript_ToxicDebrisActivates::
|
||||||
@ -7159,7 +7141,7 @@ BattleScript_TargetFormChangeWithStringNoPopup::
|
|||||||
|
|
||||||
BattleScript_BattlerFormChangeWithStringEnd3::
|
BattleScript_BattlerFormChangeWithStringEnd3::
|
||||||
pause 5
|
pause 5
|
||||||
call BattleScript_AbilityPopUp
|
call BattleScript_AbilityPopUpScripting
|
||||||
flushtextbox
|
flushtextbox
|
||||||
handleformchange BS_SCRIPTING, 0
|
handleformchange BS_SCRIPTING, 0
|
||||||
handleformchange BS_SCRIPTING, 1
|
handleformchange BS_SCRIPTING, 1
|
||||||
@ -7203,7 +7185,6 @@ BattleScript_CottonDownTargetSpeedCantGoLower:
|
|||||||
BattleScript_CottonDownLoopIncrement:
|
BattleScript_CottonDownLoopIncrement:
|
||||||
addbyte gBattlerTarget, 1
|
addbyte gBattlerTarget, 1
|
||||||
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_CottonDownLoop
|
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_CottonDownLoop
|
||||||
BattleScript_CottonDownReturn:
|
|
||||||
swapattackerwithtarget
|
swapattackerwithtarget
|
||||||
copybyte gBattlerAttacker, sSAVED_BATTLER
|
copybyte gBattlerAttacker, sSAVED_BATTLER
|
||||||
return
|
return
|
||||||
@ -7764,6 +7745,15 @@ BattleScript_CheekPouchActivates::
|
|||||||
copybyte gBattlerAttacker, sSAVED_BATTLER
|
copybyte gBattlerAttacker, sSAVED_BATTLER
|
||||||
return
|
return
|
||||||
|
|
||||||
|
BattleScript_PickupActivates::
|
||||||
|
pause 5
|
||||||
|
tryrecycleitem BattleScript_PickupActivatesEnd
|
||||||
|
call BattleScript_AbilityPopUp
|
||||||
|
printstring STRINGID_XFOUNDONEY
|
||||||
|
waitmessage B_WAIT_TIME_LONG
|
||||||
|
BattleScript_PickupActivatesEnd:
|
||||||
|
end3
|
||||||
|
|
||||||
BattleScript_HarvestActivates::
|
BattleScript_HarvestActivates::
|
||||||
pause 5
|
pause 5
|
||||||
tryrecycleitem BattleScript_HarvestActivatesEnd
|
tryrecycleitem BattleScript_HarvestActivatesEnd
|
||||||
@ -7822,7 +7812,6 @@ BattleScript_ActivateWeatherAbilities:
|
|||||||
BattleScript_ActivateWeatherAbilities_Loop:
|
BattleScript_ActivateWeatherAbilities_Loop:
|
||||||
copybyte sBATTLER, gBattlerTarget
|
copybyte sBATTLER, gBattlerTarget
|
||||||
activateweatherchangeabilities BS_TARGET
|
activateweatherchangeabilities BS_TARGET
|
||||||
BattleScript_ActivateWeatherAbilities_Increment:
|
|
||||||
addbyte gBattlerTarget, 1
|
addbyte gBattlerTarget, 1
|
||||||
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_ActivateWeatherAbilities_Loop
|
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_ActivateWeatherAbilities_Loop
|
||||||
restoretarget
|
restoretarget
|
||||||
@ -7881,7 +7870,6 @@ BattleScript_IntimidateEffect_WaitString:
|
|||||||
BattleScript_IntimidateLoopIncrement:
|
BattleScript_IntimidateLoopIncrement:
|
||||||
addbyte gBattlerTarget, 1
|
addbyte gBattlerTarget, 1
|
||||||
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_IntimidateLoop
|
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_IntimidateLoop
|
||||||
BattleScript_IntimidateEnd:
|
|
||||||
copybyte sBATTLER, gBattlerAttacker
|
copybyte sBATTLER, gBattlerAttacker
|
||||||
destroyabilitypopup
|
destroyabilitypopup
|
||||||
restoretarget
|
restoretarget
|
||||||
@ -7947,7 +7935,6 @@ BattleScript_SupersweetSyrupEffect_WaitString:
|
|||||||
BattleScript_SupersweetSyrupLoopIncrement:
|
BattleScript_SupersweetSyrupLoopIncrement:
|
||||||
addbyte gBattlerTarget, 1
|
addbyte gBattlerTarget, 1
|
||||||
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_SupersweetSyrupLoop
|
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_SupersweetSyrupLoop
|
||||||
BattleScript_SupersweetSyrupEnd:
|
|
||||||
copybyte sBATTLER, gBattlerAttacker
|
copybyte sBATTLER, gBattlerAttacker
|
||||||
destroyabilitypopup
|
destroyabilitypopup
|
||||||
restoretarget
|
restoretarget
|
||||||
@ -8014,7 +8001,7 @@ BattleScript_DeltaStreamActivates::
|
|||||||
end3
|
end3
|
||||||
|
|
||||||
BattleScript_ProtosynthesisActivates::
|
BattleScript_ProtosynthesisActivates::
|
||||||
call BattleScript_AbilityPopUp
|
call BattleScript_AbilityPopUpScripting
|
||||||
printstring STRINGID_SUNLIGHTACTIVATEDABILITY
|
printstring STRINGID_SUNLIGHTACTIVATEDABILITY
|
||||||
waitmessage B_WAIT_TIME_MED
|
waitmessage B_WAIT_TIME_MED
|
||||||
printstring STRINGID_STATWASHEIGHTENED
|
printstring STRINGID_STATWASHEIGHTENED
|
||||||
@ -8106,7 +8093,6 @@ BattleScript_ActivateTerrainSeed:
|
|||||||
removeitem BS_TARGET
|
removeitem BS_TARGET
|
||||||
BattleScript_ActivateTerrainAbility:
|
BattleScript_ActivateTerrainAbility:
|
||||||
activateterrainchangeabilities BS_TARGET
|
activateterrainchangeabilities BS_TARGET
|
||||||
BattleScript_ActivateTerrainEffects_Increment:
|
|
||||||
addbyte gBattlerTarget, 0x1
|
addbyte gBattlerTarget, 0x1
|
||||||
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_ActivateTerrainSeed
|
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_ActivateTerrainSeed
|
||||||
restoretarget
|
restoretarget
|
||||||
@ -8362,14 +8348,12 @@ BattleScript_GrassyTerrainLoop:
|
|||||||
checkgrassyterrainheal BS_ATTACKER, BattleScript_GrassyTerrainLoopIncrement
|
checkgrassyterrainheal BS_ATTACKER, BattleScript_GrassyTerrainLoopIncrement
|
||||||
printstring STRINGID_GRASSYTERRAINHEALS
|
printstring STRINGID_GRASSYTERRAINHEALS
|
||||||
waitmessage B_WAIT_TIME_LONG
|
waitmessage B_WAIT_TIME_LONG
|
||||||
BattleScript_GrassyTerrainHpChange:
|
|
||||||
orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE
|
orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE
|
||||||
healthbarupdate BS_ATTACKER
|
healthbarupdate BS_ATTACKER
|
||||||
datahpupdate BS_ATTACKER
|
datahpupdate BS_ATTACKER
|
||||||
BattleScript_GrassyTerrainLoopIncrement::
|
BattleScript_GrassyTerrainLoopIncrement::
|
||||||
addbyte gBattleCommunication, 1
|
addbyte gBattleCommunication, 1
|
||||||
jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_GrassyTerrainLoop
|
jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_GrassyTerrainLoop
|
||||||
BattleScript_GrassyTerrainLoopEnd::
|
|
||||||
bicword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE
|
bicword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE
|
||||||
jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_PERMANENT, BattleScript_GrassyTerrainHealEnd
|
jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_PERMANENT, BattleScript_GrassyTerrainHealEnd
|
||||||
BattleScript_GrassyTerrainHealEnd:
|
BattleScript_GrassyTerrainHealEnd:
|
||||||
@ -8378,7 +8362,6 @@ BattleScript_GrassyTerrainHealEnd:
|
|||||||
BattleScript_AbilityNoSpecificStatLoss::
|
BattleScript_AbilityNoSpecificStatLoss::
|
||||||
pause B_WAIT_TIME_SHORT
|
pause B_WAIT_TIME_SHORT
|
||||||
call BattleScript_AbilityPopUp
|
call BattleScript_AbilityPopUp
|
||||||
BattleScript_AbilityNoSpecificStatLossPrint:
|
|
||||||
printstring STRINGID_PKMNSXPREVENTSYLOSS
|
printstring STRINGID_PKMNSXPREVENTSYLOSS
|
||||||
waitmessage B_WAIT_TIME_LONG
|
waitmessage B_WAIT_TIME_LONG
|
||||||
setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY
|
setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY
|
||||||
@ -9165,16 +9148,6 @@ BattleScript_ArenaTurnBeginning::
|
|||||||
volumeup
|
volumeup
|
||||||
end2
|
end2
|
||||||
|
|
||||||
@ Unused
|
|
||||||
BattleScript_ArenaNothingDecided::
|
|
||||||
playse SE_DING_DONG
|
|
||||||
arenadrawreftextbox
|
|
||||||
arenajudgmentstring B_MSG_REF_NOTHING_IS_DECIDED
|
|
||||||
arenawaitmessage B_MSG_REF_NOTHING_IS_DECIDED
|
|
||||||
pause B_WAIT_TIME_LONG
|
|
||||||
arenaerasereftextbox
|
|
||||||
end2
|
|
||||||
|
|
||||||
BattleScript_ArenaDoJudgment::
|
BattleScript_ArenaDoJudgment::
|
||||||
makevisible BS_PLAYER1
|
makevisible BS_PLAYER1
|
||||||
waitstate
|
waitstate
|
||||||
@ -9274,7 +9247,6 @@ BattleScript_TotemFlaredToLife::
|
|||||||
call BattleScript_ApplyTotemVarBoost
|
call BattleScript_ApplyTotemVarBoost
|
||||||
end2
|
end2
|
||||||
|
|
||||||
@ remove the mirror herb, do totem loop
|
|
||||||
BattleScript_MirrorHerbCopyStatChangeEnd2::
|
BattleScript_MirrorHerbCopyStatChangeEnd2::
|
||||||
call BattleScript_MirrorHerbCopyStatChange
|
call BattleScript_MirrorHerbCopyStatChange
|
||||||
end2
|
end2
|
||||||
@ -9284,16 +9256,24 @@ BattleScript_MirrorHerbCopyStatChange::
|
|||||||
printstring STRINGID_MIRRORHERBCOPIED
|
printstring STRINGID_MIRRORHERBCOPIED
|
||||||
waitmessage B_WAIT_TIME_LONG
|
waitmessage B_WAIT_TIME_LONG
|
||||||
removeitem BS_SCRIPTING
|
removeitem BS_SCRIPTING
|
||||||
call BattleScript_TotemVar_Ret
|
playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
|
||||||
copybyte gBattlerAttacker, sSAVED_BATTLER @ restore the original attacker just to be safe
|
BattleScript_MirrorHerbStartCopyStats:
|
||||||
|
copyfoesstatincrease BS_SCRIPTING, BattleScript_MirrorHerbStartReturn
|
||||||
|
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorHerbStartReturn
|
||||||
|
goto BattleScript_MirrorHerbStartCopyStats
|
||||||
|
BattleScript_MirrorHerbStartReturn:
|
||||||
return
|
return
|
||||||
|
|
||||||
BattleScript_OpportunistCopyStatChange::
|
BattleScript_OpportunistCopyStatChange::
|
||||||
call BattleScript_AbilityPopUp
|
call BattleScript_AbilityPopUpScripting
|
||||||
printstring STRINGID_OPPORTUNISTCOPIED
|
playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
|
||||||
|
BattleScript_OpportunistStartCopyStats:
|
||||||
|
copyfoesstatincrease BS_SCRIPTING, BattleScript_OpportunistCopyStatChangeEnd
|
||||||
|
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_OpportunistCopyStatChangeEnd
|
||||||
|
printfromtable gStatUpStringIds
|
||||||
waitmessage B_WAIT_TIME_LONG
|
waitmessage B_WAIT_TIME_LONG
|
||||||
call BattleScript_TotemVar_Ret
|
goto BattleScript_OpportunistStartCopyStats
|
||||||
copybyte gBattlerAttacker, sSAVED_BATTLER @ restore the original attacker just to be safe
|
BattleScript_OpportunistCopyStatChangeEnd:
|
||||||
end3
|
end3
|
||||||
|
|
||||||
BattleScript_TotemVar::
|
BattleScript_TotemVar::
|
||||||
@ -9467,7 +9447,6 @@ BattleScript_EffectExtremeEvoboost::
|
|||||||
BattleScript_ExtremeEvoboostAnim:
|
BattleScript_ExtremeEvoboostAnim:
|
||||||
attackanimation
|
attackanimation
|
||||||
waitanimation
|
waitanimation
|
||||||
BattleScript_ExtremeEvoboostAtk::
|
|
||||||
setbyte sSTAT_ANIM_PLAYED, FALSE
|
setbyte sSTAT_ANIM_PLAYED, FALSE
|
||||||
playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, 0x0
|
playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, 0x0
|
||||||
setstatchanger STAT_ATK, 2, FALSE
|
setstatchanger STAT_ATK, 2, FALSE
|
||||||
@ -10025,7 +10004,6 @@ BattleScript_CouldntFullyProtect::
|
|||||||
return
|
return
|
||||||
|
|
||||||
BattleScript_BerserkGeneRet::
|
BattleScript_BerserkGeneRet::
|
||||||
BattleScript_BerserkGeneRet_Anim:
|
|
||||||
savetarget
|
savetarget
|
||||||
copybyte gBattlerTarget, sBATTLER
|
copybyte gBattlerTarget, sBATTLER
|
||||||
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_BerserkGeneRet_TryConfuse
|
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_BerserkGeneRet_TryConfuse
|
||||||
|
|||||||
@ -45,7 +45,7 @@ BattleScript_UseItemMessage:
|
|||||||
printfromtable gTrainerUsedItemStringIds
|
printfromtable gTrainerUsedItemStringIds
|
||||||
waitmessage B_WAIT_TIME_LONG
|
waitmessage B_WAIT_TIME_LONG
|
||||||
return
|
return
|
||||||
|
|
||||||
BattleScript_ItemRestoreHPRet:
|
BattleScript_ItemRestoreHPRet:
|
||||||
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
|
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
|
||||||
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
|
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
|
||||||
@ -159,7 +159,6 @@ BattleScript_SafariBallThrow::
|
|||||||
BattleScript_SuccessBallThrow::
|
BattleScript_SuccessBallThrow::
|
||||||
setbyte sMON_CAUGHT, TRUE
|
setbyte sMON_CAUGHT, TRUE
|
||||||
incrementgamestat GAME_STAT_POKEMON_CAPTURES
|
incrementgamestat GAME_STAT_POKEMON_CAPTURES
|
||||||
BattleScript_PrintCaughtMonInfo::
|
|
||||||
printstring STRINGID_GOTCHAPKMNCAUGHTPLAYER
|
printstring STRINGID_GOTCHAPKMNCAUGHTPLAYER
|
||||||
jumpifbyte CMP_NOT_EQUAL, sEXP_CATCH, TRUE, BattleScript_TryPrintCaughtMonInfo
|
jumpifbyte CMP_NOT_EQUAL, sEXP_CATCH, TRUE, BattleScript_TryPrintCaughtMonInfo
|
||||||
setbyte sGIVEEXP_STATE, 0
|
setbyte sGIVEEXP_STATE, 0
|
||||||
|
|||||||
@ -587,6 +587,37 @@ EventScript_WhiteOut::
|
|||||||
goto EventScript_ResetMrBriney
|
goto EventScript_ResetMrBriney
|
||||||
end
|
end
|
||||||
|
|
||||||
|
EventScript_AfterWhiteOutHeal::
|
||||||
|
lockall
|
||||||
|
msgbox gText_FirstShouldRestoreMonsHealth
|
||||||
|
call EventScript_PkmnCenterNurse_TakeAndHealPkmn
|
||||||
|
call_if_unset FLAG_DEFEATED_RUSTBORO_GYM, EventScript_AfterWhiteOutHealMsgPreRoxanne
|
||||||
|
call_if_set FLAG_DEFEATED_RUSTBORO_GYM, EventScript_AfterWhiteOutHealMsg
|
||||||
|
applymovement VAR_LAST_TALKED, Movement_PkmnCenterNurse_Bow
|
||||||
|
waitmovement 0
|
||||||
|
fadedefaultbgm
|
||||||
|
releaseall
|
||||||
|
end
|
||||||
|
|
||||||
|
EventScript_AfterWhiteOutHealMsgPreRoxanne::
|
||||||
|
msgbox gText_MonsHealedShouldBuyPotions
|
||||||
|
return
|
||||||
|
|
||||||
|
EventScript_AfterWhiteOutHealMsg::
|
||||||
|
msgbox gText_MonsHealed
|
||||||
|
return
|
||||||
|
|
||||||
|
EventScript_AfterWhiteOutMomHeal::
|
||||||
|
lockall
|
||||||
|
applymovement LOCALID_MOM, Common_Movement_WalkInPlaceFasterDown
|
||||||
|
waitmovement 0
|
||||||
|
msgbox gText_HadQuiteAnExperienceTakeRest
|
||||||
|
call Common_EventScript_OutOfCenterPartyHeal
|
||||||
|
msgbox gText_MomExplainHPGetPotions
|
||||||
|
fadedefaultbgm
|
||||||
|
releaseall
|
||||||
|
end
|
||||||
|
|
||||||
EventScript_ResetMrBriney::
|
EventScript_ResetMrBriney::
|
||||||
goto_if_eq VAR_BRINEY_LOCATION, 1, EventScript_MoveMrBrineyToHouse
|
goto_if_eq VAR_BRINEY_LOCATION, 1, EventScript_MoveMrBrineyToHouse
|
||||||
goto_if_eq VAR_BRINEY_LOCATION, 2, EventScript_MoveMrBrineyToDewford
|
goto_if_eq VAR_BRINEY_LOCATION, 2, EventScript_MoveMrBrineyToDewford
|
||||||
@ -892,6 +923,48 @@ gText_PlayerWhitedOut::
|
|||||||
.string "{PLAYER} is out of usable\n"
|
.string "{PLAYER} is out of usable\n"
|
||||||
.string "POKéMON!\p{PLAYER} whited out!$"
|
.string "POKéMON!\p{PLAYER} whited out!$"
|
||||||
|
|
||||||
|
gText_FirstShouldRestoreMonsHealth::
|
||||||
|
.string "First, you should restore your\n"
|
||||||
|
.string "POKéMON to full health.$"
|
||||||
|
|
||||||
|
gText_MonsHealedShouldBuyPotions::
|
||||||
|
.string "Your POKéMON have been healed\n"
|
||||||
|
.string "to perfect health.\p"
|
||||||
|
.string "If your POKéMON's energy, HP,\n"
|
||||||
|
.string "is down, please come see us.\p"
|
||||||
|
.string "If you're planning to go far in the\n"
|
||||||
|
.string "field, you should buy some POTIONS\l"
|
||||||
|
.string "at the POKéMON MART.\p"
|
||||||
|
.string "We hope you excel!$"
|
||||||
|
|
||||||
|
gText_MonsHealed::
|
||||||
|
.string "Your POKéMON have been healed\n"
|
||||||
|
.string "to perfect health.\p"
|
||||||
|
.string "We hope you excel!$"
|
||||||
|
|
||||||
|
gText_HadQuiteAnExperienceTakeRest::
|
||||||
|
.string "MOM: {PLAYER}!\n"
|
||||||
|
.string "Welcome home.\p"
|
||||||
|
.string "It sounds like you had quite\n"
|
||||||
|
.string "an experience.\p"
|
||||||
|
.string "Maybe you should take a quick\n"
|
||||||
|
.string "rest.$"
|
||||||
|
|
||||||
|
gText_MomExplainHPGetPotions::
|
||||||
|
.string "MOM: Oh, good! You and your\n"
|
||||||
|
.string "POKéMON are looking great.\p"
|
||||||
|
.string "I just heard from PROF. BIRCH.\p"
|
||||||
|
.string "He said that POKéMON's energy is\n"
|
||||||
|
.string "measured in HP.\p"
|
||||||
|
.string "If your POKéMON lose their HP,\n"
|
||||||
|
.string "you can restore them at any\l"
|
||||||
|
.string "POKéMON CENTER.\p"
|
||||||
|
.string "If you're going to travel far away,\n"
|
||||||
|
.string "the smart TRAINER stocks up on\l"
|
||||||
|
.string "POTIONS at the POKéMON MART.\p"
|
||||||
|
.string "Make me proud, honey!\p"
|
||||||
|
.string "Take care!$"
|
||||||
|
|
||||||
gText_RegisteredTrainerinPokeNav::
|
gText_RegisteredTrainerinPokeNav::
|
||||||
.string "Registered {STR_VAR_1} {STR_VAR_2}\n"
|
.string "Registered {STR_VAR_1} {STR_VAR_2}\n"
|
||||||
.string "in the POKéNAV.$"
|
.string "in the POKéNAV.$"
|
||||||
|
|||||||
@ -439,4 +439,14 @@ Debug_EventScript_InflictStatus1_Text_Freeze:
|
|||||||
Debug_EventScript_InflictStatus1_Text_Frostbite:
|
Debug_EventScript_InflictStatus1_Text_Frostbite:
|
||||||
.string "Frostbite$"
|
.string "Frostbite$"
|
||||||
|
|
||||||
|
Debug_EventScript_EWRAMCounters::
|
||||||
|
callnative CheckEWRAMCounters
|
||||||
|
msgbox Debug_EventScript_EWRAMCounters_Text, MSGBOX_DEFAULT
|
||||||
|
release
|
||||||
|
end
|
||||||
|
|
||||||
|
Debug_EventScript_EWRAMCounters_Text::
|
||||||
|
.string "Follower Steps: {STR_VAR_1}.\n"
|
||||||
|
.string "Fishing Chain: {STR_VAR_2}.$"
|
||||||
|
|
||||||
.endif
|
.endif
|
||||||
|
|||||||
@ -59,6 +59,6 @@ def rellocate_follower_graphics():
|
|||||||
#os.popen('cp followers/' + name + '.png followers/' + name + '/follower.png')
|
#os.popen('cp followers/' + name + '.png followers/' + name + '/follower.png')
|
||||||
#os.remove('followers/' + name + '.png')
|
#os.remove('followers/' + name + '.png')
|
||||||
#print(pth)
|
#print(pth)
|
||||||
#subprocess.run(["tools/gbagfx/gbagfx " + name +".png " + name + "_normal.pal'" + str(count) + "'"])
|
#subprocess.run(["tools/gbagfx/gbagfx " + name +".png " + name + "_normal.pal'" + str(count) + "'"])
|
||||||
|
|
||||||
rellocate_follower_graphics()
|
rellocate_follower_graphics()
|
||||||
|
|||||||
@ -3,8 +3,25 @@
|
|||||||
- [README](./README.md)
|
- [README](./README.md)
|
||||||
- [Installation](./INSTALL.md)
|
- [Installation](./INSTALL.md)
|
||||||
- [Setting up WSL1 (Legacy Portion)](./legacy_WSL1_INSTALL.md)
|
- [Setting up WSL1 (Legacy Portion)](./legacy_WSL1_INSTALL.md)
|
||||||
|
- [Run documentation site locally](local_mdbook/index.md)
|
||||||
|
- [Ubuntu WSL1/WSL2](local_mdbook/ubuntu_WSL.md)
|
||||||
|
- [AI Flags](./ai_flags.md)
|
||||||
|
- [Tutorials]()
|
||||||
|
- [How to add new AI Flags](./ai_logic.md)
|
||||||
|
- [How to add new battle script commands/macros](./how_to_battle_script_command_macro.md)
|
||||||
|
- [How to add a new move](./how_to_new_move.md)
|
||||||
|
- [How to add a new trainer class](./how_to_trainer_class.md)
|
||||||
|
- [How to add a new Pokémon]()
|
||||||
|
- [v1.9.x](./how_to_new_pokemon_1_9_0.md)
|
||||||
|
- [v1.8.x](./how_to_new_pokemon_1_8_0.md)
|
||||||
|
- [v1.7.x](./how_to_new_pokemon_1_7_0.md)
|
||||||
|
- [v1.6.x](./how_to_new_pokemon_1_6_0.md)
|
||||||
|
- [How to use the Testing System](./how_to_testing_system.md)
|
||||||
- [Changelog](./CHANGELOG.md)
|
- [Changelog](./CHANGELOG.md)
|
||||||
|
- [1.9.x]()
|
||||||
|
- [Version 1.9.0](changelogs/1.9.x/1.9.0.md)
|
||||||
- [1.8.x]()
|
- [1.8.x]()
|
||||||
|
- [Version 1.8.6](changelogs/1.8.x/1.8.6.md)
|
||||||
- [Version 1.8.5](changelogs/1.8.x/1.8.5.md)
|
- [Version 1.8.5](changelogs/1.8.x/1.8.5.md)
|
||||||
- [Version 1.8.4](changelogs/1.8.x/1.8.4.md)
|
- [Version 1.8.4](changelogs/1.8.x/1.8.4.md)
|
||||||
- [Version 1.8.3](changelogs/1.8.x/1.8.3.md)
|
- [Version 1.8.3](changelogs/1.8.x/1.8.3.md)
|
||||||
|
|||||||
154
docs/ai_flags.md
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
# What are AI Flags?
|
||||||
|
AI flags alter the behavior of AI controlled trainers. These flags affect what moves the AI chooses to use, what Pokémon the AI sends out and when they decide to switch, overarching strategic choices the AI prefers to make, and more.
|
||||||
|
|
||||||
|
The AI flags can be found in [`include/constants/battle_ai.h`](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/battle_ai.h). Some flags have their own dedicated functions that affect how the AI scores its options when choosing what to do in battle, and those functions can be found in [`src/battle_ai_main.c`](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/battle_ai_main.c). Other flags are used in conditional checks to gate certain behaviour behind certain flags, which you can typically find by searching the codebase for the flag name and browsing from there.
|
||||||
|
|
||||||
|
# What flags should you use?
|
||||||
|
When adding new AI flags it is recommended to use `AI_FLAG_CHECK_BAD_MOVE`, `AI_FLAG_CHECK_VIABILITY`, `AI_FLAG_TRY_TO_FAINT` to make sure the AI makes good decisions. It is especially important to use `AI_FLAG_CHECK_BAD_MOVE` in combination with any added flags otherwise the AI will use moves that can fail.
|
||||||
|
|
||||||
|
Other flags should be used with consideration to the circumstances.
|
||||||
|
|
||||||
|
# How do you use them?
|
||||||
|
Adding an AI flag to a trainer is straightforward, but the process is different depending on how trainers are being defined.
|
||||||
|
|
||||||
|
## `COMPETITIVE_PARTY_SYNTAX == TRUE`
|
||||||
|
If you are using competitive syntax parties, navigate to the trainer data in [`src/data/trainers.party`](https://github.com/rh-hideout/pokeemerald-expansion/blob/upcoming/src/data/trainers.party), find the trainer you’d like to change, and add flags like so:
|
||||||
|
AI: Check Bad Move / Try to Faint / Check Viability. The name of each flag is just the constant, but without AI_FLAG at the beginning. For example, to add `AI_FLAG_SEQUENCE_SWITCHING`, any of the following will work:
|
||||||
|
* AI_FLAG_SEQUENCE_SWITCHING
|
||||||
|
* SEQUENCE_SWITCHING
|
||||||
|
* SEQUENCE SWITCHING
|
||||||
|
* Sequence_Switching
|
||||||
|
* Sequence Switching
|
||||||
|
|
||||||
|
## `COMPETITIVE_PARTY_SYNTAX != TRUE` / Not Found
|
||||||
|
If you are not using competitive syntax parties, instead access the trainer data directly in [`src/data/trainers.h`](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h), and add flags like so, typed exactly the same as the flag names themselves:
|
||||||
|
`.aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY`
|
||||||
|
|
||||||
|
# What AI Flags does pokeemerald-expansion have?
|
||||||
|
This section lists all of expansion’s AI Flags and briefly describes the effect they have on the AI’s behaviour. In all cases, please check the corresponding function or surrounding code around their implementation for more details. Some of these functions are vanilla, some share a name with vanilla but have been modified to varying degrees, and some are completely new.
|
||||||
|
|
||||||
|
## `AI_FLAG_CHECK_BAD_MOVE`
|
||||||
|
The AI will avoid using moves that are likely to fail in the current situation. This flag helps prevent the AI from making ineffective choices, such as using moves into immunities, into invulnerable states, or when the moves are otherwise hindered by abilities, terrain, or status conditions.
|
||||||
|
|
||||||
|
## `AI_FLAG_TRY_TO_FAINT`
|
||||||
|
AI will prioritize KOing the player if able rather than using status moves. Will prioritize using a move that can OHKO the player. If the player can KO the AI’s mon and the AI’s mon is slower, prioritize priority moves (this does not prevent the AI from switching out instead).
|
||||||
|
|
||||||
|
This flag handles scoring for OHKOs but does not handle 2HKOs at all, `AI_FLAG_STRONGEST_MOVE` should be used for 2HKO scoring.
|
||||||
|
|
||||||
|
## `AI_FLAG_CHECK_VIABILITY`
|
||||||
|
This flag is divided into two components to calculate the best available move for the current context:
|
||||||
|
- **`AI_CompareDamagingMoves`**: This function compares damaging moves against each other and picks the best one.
|
||||||
|
- **`AI_CalcMoveEffectScore`**: This function checks every move effect (status or damaging move effect) and increases the score accordingly.
|
||||||
|
|
||||||
|
This is different to `AI_FLAG_CHECK_BAD_MOVE` as it calculates how poor a move is and not whether it will fail or not.
|
||||||
|
|
||||||
|
## `AI_FLAG_SETUP_FIRST_TURN`
|
||||||
|
AI will prioritize using setup moves on the first turn. These include stat buffs, field effects, status moves, etc.
|
||||||
|
|
||||||
|
This is just a flat increase without any consideration of whether it makes sense to use the move or not. For better move choice quality for those moves, `AI_FLAG_CHECK_VIABILITY` should be used.
|
||||||
|
|
||||||
|
## `AI_FLAG_RISKY`
|
||||||
|
AI will generally behave more recklessly. This AI enables the following behaviour:
|
||||||
|
* Always assume the highest damage roll when scoring moves
|
||||||
|
* Blindly Mirror Coat / Counter based on the player mon’s species higher attacking stat
|
||||||
|
* Moves with Recoil if they miss are not treated differently even if accuracy is lowered
|
||||||
|
* Prioritize maximizing damage from moves at the cost of accuracy
|
||||||
|
* Prioritize moves with low change strong effects (Ancient Power etc., check `AI_Risky` function for full list)
|
||||||
|
* Switch offensively mid battle rather than defensively (if using `AI_FLAG_SMART_MON_CHOICES`)
|
||||||
|
* Prioritize Explosion moves
|
||||||
|
|
||||||
|
## `AI_FLAG_PREFER_STRONGEST_MOVE`
|
||||||
|
Adds score bonus to any move the AI has that either OHKOs or 2HKOs the player.
|
||||||
|
|
||||||
|
Keep in mind that this is a weaker form of `AI_FLAG_TRY_TO_FAINT` at scoring OHKOs as it does not take into account who is attacking first, it does however handle 2HKOs.
|
||||||
|
|
||||||
|
## `AI_FLAG_PREFER_BATON_PASS`
|
||||||
|
AI prefers raising its own stats if it has >= 60% HP, as well as Ingrain, Aqua Ring, and Protect. Prioritizes Baton Bass if the mon is rooted (Ingrain) or has the Aqua Ring effect, and doesn’t if it has been Leech Seeded.
|
||||||
|
|
||||||
|
## `AI_FLAG_DOUBLE_BATTLE`
|
||||||
|
This flag is automatically set in double battles, and controls much of the doubles-specific scoring. I’ll summarize some of its scoring as follows:
|
||||||
|
* Don’t use Helping Hand if partner is, don’t Perish Trap your partner, don’t change the weather if they are, don’t buff stats if partner will trigger Anger Point for us
|
||||||
|
* Collaborate with partner to Perish Trap opponent, Magnet Rise to protect partner, Dragon Cheer partner if applicable
|
||||||
|
* Prioritize using weather move if it benefits partner
|
||||||
|
* Prioritize triggering partner’s good abilities if possible (Motor Drive, Storm Drain, Beat Up -> Justified, etc.)
|
||||||
|
* Handle Skill Swap smartly, both with the partner and against the player
|
||||||
|
|
||||||
|
## `AI_FLAG_HP_AWARE`
|
||||||
|
Lets the AI make decisions based on how much remaining HP its mon(s) and the player’s mon(s) have.
|
||||||
|
|
||||||
|
With respect to the AI’s mons, in doubles:
|
||||||
|
* Allows the AI to attack its partner with a move it can absorb if its low on HP (ie. Electric move on partner with Volt Absorb)
|
||||||
|
* Prioritizes healing its partner if its HP is <= 50% if able
|
||||||
|
|
||||||
|
In both singles and doubles:
|
||||||
|
* Prioritizes not using moves that require the user fainting (Destiny Bond, Explosion etc.) and healing moves while on >= 70% HP.
|
||||||
|
* Prioritize not using moves that require the user fainting or losing significant HP (Belly Drum etc) while between 30% and 70% HP
|
||||||
|
* Prioritize not using setup moves (Light Screen etc.) and Bide while on <= 30% HP
|
||||||
|
|
||||||
|
With respect to the player’s mons:
|
||||||
|
* Prioritize not using many status moves (stat buffs, Poison, Pain Split) if the player has between 30% and 70% HP
|
||||||
|
* Prioritize not using any status moves if the player is has <= 30% HP
|
||||||
|
|
||||||
|
## `AI_FLAG_POWERFUL_STATUS`
|
||||||
|
AI prioritizes setting up field effects (Trick Room, Rain Dance, etc.) and side statuses (Tailwind, Spikes, etc.), even if it could faint the target.
|
||||||
|
|
||||||
|
## `AI_FLAG_NEGATE_UNAWARE`
|
||||||
|
AI does not understand ability suppression (Mold Breaker etc., weather suppression (Air Lock etc.), redirection abilities (Lightningrod etc.) being temporarily removed due to move effects (Sky Drop etc.), or item suppression (Magic Room etc.) and will ignore them. This is a handicap flag.
|
||||||
|
|
||||||
|
## `AI_FLAG_WILL_SUICIDE`
|
||||||
|
AI prioritizes self destruction moves (Explosion, Memento).
|
||||||
|
|
||||||
|
## `AI_FLAG_PREFER_STATUS_MOVES`
|
||||||
|
AI gets a score bonus for status moves. This should be combined with `AI_FLAG_CHECK_BAD_MOVE` to prevent using only status moves.
|
||||||
|
|
||||||
|
## `AI_FLAG_STALL`
|
||||||
|
AI prefers simple classically "stalling" behaviour. It will prioritize:
|
||||||
|
* Mean Look, Fairy Lock, and Wrap for trapping
|
||||||
|
* Increasing its defense and special defense
|
||||||
|
* Moves that inflict Poison if it also has a Protect move
|
||||||
|
* Copying defense and special defense buffs
|
||||||
|
|
||||||
|
## `AI_FLAG_SMART_SWITCHING`
|
||||||
|
Affects when the AI chooses to switch. AI will make smarter decisions about when to switch out mid-battle. Automatically enables `AI_FLAG_SMART_MON_CHOICES`, which is required as the vanilla mon selection AI is not smart enough to handle several switch-triggering situations appropriately, leading to bizarre behaviour. Many of these checks have intentional failure rates, so the AI won’t switch out 100% of the time in these cases to keep the player from being able to predict perfectly. Some of these also only apply to singles, and many of them are being simplified for the sake of brevity. This flag lets the AI trigger switches when:
|
||||||
|
* It can’t hit Wonder Guard and has another mon in the party that can (switch that mon in)
|
||||||
|
* It’s going to die to Perish Song, can’t KO the player and is affected by Yawn, is being severely affected by a status condition that switching helps (Curse, Toxic, Leech Seed)
|
||||||
|
* It has a mon that can trap the player’s mon and win the 1v1 (switch that mon in)
|
||||||
|
* It has a mon in the party that can absorb the player’s next expected attack (switch that mon in)
|
||||||
|
* It will not switch if the current mon will die to hazards on re-entry and it has no means of clearing them in its party
|
||||||
|
* All its moves are bad
|
||||||
|
* It can take advantage of Natural Cure or Regenerator
|
||||||
|
* Its Encore’d into something bad
|
||||||
|
* Its primary attacking stats are sufficiently lowered
|
||||||
|
* Its "odds are bad", which is a generic "try to make smart, player-like decisions generally speaking" check. Switches can be triggered if the player has a good switchin candidate (`AI_FLAG_SMART_MON_CHOICES`), and:
|
||||||
|
* The current mon has a bad type matchup and doesn’t have a super effective move and has at least ½ HP, or ¼ HP and Regenerator, or
|
||||||
|
* The current mon loses the 1v1 quickly and has at least ½ HP, or ¼ and Regenerator
|
||||||
|
|
||||||
|
## `AI_FLAG_ACE_POKEMON`
|
||||||
|
Marks the last Pokemon in the party as the Ace Pokemon. It will not be used unless it is the last one remaining, or is forced to be switched in (Roar, U-Turn with 1 mon remaining, etc.)
|
||||||
|
|
||||||
|
## `AI_FLAG_OMNISCIENT`
|
||||||
|
AI has full knowledge of player moves, abilities, and hold items, and can use this knowledge when making decisions.
|
||||||
|
|
||||||
|
## `AI_FLAG_SMART_MON_CHOICES`
|
||||||
|
Affects what the AI chooses to send out after a switch. AI will make smarter decisions when choosing which mon to send out mid-battle and after a KO, which are handled separately. Automatically included when `AI_FLAG_SMART_SWITCHING` is enabled.
|
||||||
|
|
||||||
|
With this flag enabled, the AI will prioritize choosing mons after a KO prioritizing the following criteria:
|
||||||
|
* Trapper (can trap the player’s mon and win the 1v1)
|
||||||
|
* Revenge killer (outspeeds an OHKOs / is outsped and OHKOs, is not OHKOd/ outspeeds and 2HKOs, is not OHKOd / is outsped and 2HKOs, is not 2HKOd)
|
||||||
|
* Has good type matchup and a super effective move
|
||||||
|
* Has good type matchup and does not have a super effective move
|
||||||
|
* Has Baton Pass
|
||||||
|
* If no mons meet any of the above criteria, choose the one that does the most damage
|
||||||
|
|
||||||
|
And will choose mons after a mid-battle switch prioritizing the following criteria:
|
||||||
|
* Trapper (can trap the player’s mon and win the 1v1)
|
||||||
|
* Has good type matchup and a super effective move
|
||||||
|
* Has good type matchup and does not have a super effective move
|
||||||
|
* Is not 3HKO’d by the player
|
||||||
|
* Has Baton Pass
|
||||||
|
|
||||||
|
## `AI_FLAG_CONSERVATIVE`
|
||||||
|
AI always assumes it will roll the lowest possible result when comparing damage in scoring.
|
||||||
|
|
||||||
|
## `AI_FLAG_SEQUENCE_SWITCHING`
|
||||||
|
AI will always switch out after a KO in exactly party order as defined in the trainer data (ie. slot 1, then 2, then 3, etc.). The AI will never switch out mid-battle unless forced to (Roar etc.). If the AI uses a move that requires a switch where it makes a decision about what to send in (U-Turn etc.), it will always switch out into the lowest available party index.
|
||||||
31
docs/ai_logic.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# How to add new AI Flags
|
||||||
|
|
||||||
|
The battle engine upgrade has rewritten the AI battle scripts to C functions to easily add new logic. This tutorial explains how to add a new AI logic flag.
|
||||||
|
|
||||||
|
## 1. Define your flag
|
||||||
|
|
||||||
|
Open `include/constants/battle_ai.h`. We have many unused flags, but you can add a new one after `AI_FLAG_SMART_SWITCHING` like so:
|
||||||
|
|
||||||
|
`#define AI_FLAG_SUPPORT (1 << 16)`
|
||||||
|
|
||||||
|
## 2. Make your new function
|
||||||
|
|
||||||
|
Open `src/battle_ai_main.c`. Search for the array `static s16 (*const sBattleAiFuncTable[])(u8, u8, u16, s16)`. We want to add our new function to this table. Since we have defined our flag as `(1 << 16)`, find the 16th entry in the table (identifiable by the initializer, `[16]`), and replace it with:
|
||||||
|
|
||||||
|
`[16] = AI_Support, // AI_FLAG_SUPPORT`
|
||||||
|
|
||||||
|
Define your function above the table as `static s16 AI_Support(u8 battlerAtk, u8 battlerDef, u16 move, s16 score);`
|
||||||
|
|
||||||
|
## Make your function do something
|
||||||
|
|
||||||
|
at the bottom of the file, add:
|
||||||
|
```c
|
||||||
|
static s16 AI_Support(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
|
||||||
|
{
|
||||||
|
// Add your logic here!
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Give your trainer the correct AI flag!
|
||||||
|
|
||||||
|
And that's it!
|
||||||
@ -92,5 +92,5 @@
|
|||||||
* Court Change by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3160
|
* Court Change by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3160
|
||||||
* Item Effects
|
* Item Effects
|
||||||
* Utility Umbrella, by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2835
|
* Utility Umbrella, by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2835
|
||||||
|
|
||||||
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.5.1...expansion/1.5.2
|
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.5.1...expansion/1.5.2
|
||||||
@ -9,8 +9,8 @@
|
|||||||
## CRITICAL FIX, please update to avoid the issues detailed down below:
|
## CRITICAL FIX, please update to avoid the issues detailed down below:
|
||||||
- Fixed memory corruption when handling trigger sprites by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3238
|
- Fixed memory corruption when handling trigger sprites by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3238
|
||||||
- This had the posibility of manifesting in weird ways, like camera and music changes, NPC duplication and more. If you've had this issue in the past, we ***heavily*** recommend you update to this version of the expansion.
|
- This had the posibility of manifesting in weird ways, like camera and music changes, NPC duplication and more. If you've had this issue in the past, we ***heavily*** recommend you update to this version of the expansion.
|
||||||
- Thank you @Bassoonian for helping us pinpointing the issue.
|
- Thank you @Bassoonian for helping us pinpointing the issue.
|
||||||
|
|
||||||
 
|
 
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -41,7 +41,7 @@
|
|||||||
* Clodsire
|
* Clodsire
|
||||||
* Crocalor
|
* Crocalor
|
||||||
* Dolliv
|
* Dolliv
|
||||||
* Dudunsparce
|
* Dudunsparce
|
||||||
* Esparthra
|
* Esparthra
|
||||||
### Fixed
|
### Fixed
|
||||||
* Multiple Pokémon graphical fixes by @katykat5099 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3805
|
* Multiple Pokémon graphical fixes by @katykat5099 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3805
|
||||||
|
|||||||
@ -58,7 +58,7 @@
|
|||||||
* Pawmi (Front by KingOfThe-X-Roads, back by Vent, QC by leParagon)
|
* Pawmi (Front by KingOfThe-X-Roads, back by Vent, QC by leParagon)
|
||||||
* Pawmo (By vent, qc by leParagon)
|
* Pawmo (By vent, qc by leParagon)
|
||||||
* Okidogi (Front by KingOfThe-X-Roads + by leParagon, back by Lykeron + QC by Alexandrev2. 0)
|
* Okidogi (Front by KingOfThe-X-Roads + by leParagon, back by Lykeron + QC by Alexandrev2. 0)
|
||||||
* Backported Hedara's Terapagos from `upcoming`.
|
* Backported @hedara90's Terapagos from https://github.com/rh-hideout/pokeemerald-expansion/pull/4691
|
||||||
* Updated wild held items to Gen 9 by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4769
|
* Updated wild held items to Gen 9 by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4769
|
||||||
* Teddiursa (Common: None_> Honey)
|
* Teddiursa (Common: None_> Honey)
|
||||||
* Bisharp (Rare: None -> Leader's Crest)
|
* Bisharp (Rare: None -> Leader's Crest)
|
||||||
|
|||||||
154
docs/changelogs/1.8.x/1.8.6.md
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
# Version 1.8.6
|
||||||
|
|
||||||
|
```md
|
||||||
|
## How to update
|
||||||
|
- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`.
|
||||||
|
- Once you have your remote set up, run the command `git pull RHH expansion/1.8.6`.
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🌋 *REFACTORS* 🌋
|
||||||
|
* [Opportunist/Mirror Herb Refactor](#opportunistmirror-herb-refactor-by-alexon1ine-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4928)
|
||||||
|
* [Removed unused Battle Script labels](#removed-unused-battle-script-labels-by-bassoonian-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4839)
|
||||||
|
* [Fixed Trace not respecting the speed order like other switch-in abilities](#fixed-trace-not-respecting-the-speed-order-like-other-switch-in-abilities-by-alexon1ine-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4941)
|
||||||
|
|
||||||
|
## 🧬 General 🧬
|
||||||
|
### Fixed
|
||||||
|
* Fixed Battle Frontier ineligibility blocking the entire party if it encountered a disabled species by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4997
|
||||||
|
* Fixed random IVs given when using `givemon` only giving values from 1-31 by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/5021
|
||||||
|
* Fixed `givemon` not giving Cherish Ball by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5022
|
||||||
|
|
||||||
|
## 🐉 Pokémon 🐉
|
||||||
|
### Added
|
||||||
|
* Added missing Terapagos Stellar sprite by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5008
|
||||||
|
* Added missing Ogerpon Tera sprites by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4996
|
||||||
|
### Changed
|
||||||
|
* Temporarely reverted regional form inheritance to fix issue with non-regional forms by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/5004
|
||||||
|
* Updated level up learnsets up to Indigo Disk by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/5023
|
||||||
|
### Fixed
|
||||||
|
* Fixed Basculegion learning Dire Claw in Gen9's level up learnset by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4948
|
||||||
|
* Fixed Sandile's sprite by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5038
|
||||||
|
|
||||||
|
## ⚔️ Battle General ⚔️ ##
|
||||||
|
### Fixed
|
||||||
|
* Fixed Debug Menu not properly updating the corresponding flags + general cleanup by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4643
|
||||||
|
* Fixed spread damage in double battles by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/5064
|
||||||
|
* In double battles when `B_POSITION_OPPONENT_LEFT` fainted from the first hit of a spread move, the second hit dealt 100% of damage to `B_POSITION_OPPONENT_RIGHT`.
|
||||||
|
* #### Removed unused Battle Script labels by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4839
|
||||||
|
* `data/battle_scripts_1.s`
|
||||||
|
* `BattleScript_OctolockTryLowerDef`
|
||||||
|
* `BattleScript_OctolockTurnDmgPrintMsg`
|
||||||
|
* `BattleScript_StuffCheeksEatBerry`
|
||||||
|
* `BattleScript_StrengthSapTryHp` and its contents.
|
||||||
|
* `BattleScript_PartingShotEnd` and its contents.
|
||||||
|
* `BattleScript_RototillerAffected`
|
||||||
|
* `BattleScript_AutotomizeDoAnim`
|
||||||
|
* `BattleScript_TryTailwindAbilitiesLoop_Ret`
|
||||||
|
* `BattleScript_HitFromAtkCanceler`
|
||||||
|
* `BattleScript_EffectMultiHit`
|
||||||
|
* `BattleScript_BattleScript_EffectParalyzeNoTypeCalc`
|
||||||
|
* `BattleScript_EffectTeleportTryToRunAway`
|
||||||
|
* `BattleScript_WindPowerActivates_Ret`
|
||||||
|
* `BattleScript_CottonDownReturn`
|
||||||
|
* `BattleScript_ActivateWeatherAbilities_Increment`
|
||||||
|
* `BattleScript_IntimidateEnd`
|
||||||
|
* `BattleScript_SupersweetSyrupEnd`
|
||||||
|
* `BattleScript_ActivateTerrainEffects_Increment`
|
||||||
|
* `BattleScript_GrassyTerrainHpChange`
|
||||||
|
* `BattleScript_GrassyTerrainLoopEnd`
|
||||||
|
* `BattleScript_AbilityNoSpecificStatLossPrint`
|
||||||
|
* `BattleScript_ArenaNothingDecided`
|
||||||
|
* `BattleScript_ExtremeEvoboostAtk`
|
||||||
|
* `BattleScript_BerserkGeneRet_Anim`
|
||||||
|
* `data/battle_scripts_2.s`
|
||||||
|
* `BattleScript_PrintCaughtMonInfo`
|
||||||
|
* #### Opportunist/Mirror Herb Refactor by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4928
|
||||||
|
* Multiple fixes:
|
||||||
|
* Opportunist stacking multiple boosts in one turn from opposing mons.
|
||||||
|
* Increasing the stat by the wrong amount when copying opposing boost (eg. +6 boosts).
|
||||||
|
* Opportunist no longer has a message.
|
||||||
|
* Opportunist only play animations once for every stat boost.
|
||||||
|
* Changes:
|
||||||
|
* `switchInBattlerCounter` replaces both `switchInAbilitiesCounter` and `switchInItemsCounter`.
|
||||||
|
* Removed `STRINGID_OPPORTUNISTCOPIED` and `sText_OpportunistCopied`.
|
||||||
|
* Altered `TryDoEventsBeforeFirstTurn` to use a state switch (`gBattleStruct->eventsBeforeFirstTurnState`)
|
||||||
|
* `FIRST_TURN_EVENTS_START`.
|
||||||
|
* `FIRST_TURN_EVENTS_OVERWORLD_WEATHER`.
|
||||||
|
* `FIRST_TURN_EVENTS_TERRAIN`.
|
||||||
|
* `FIRST_TURN_EVENTS_STARTING_STATUS`.
|
||||||
|
* `FIRST_TURN_EVENTS_TOTEM_BOOST`.
|
||||||
|
* `FIRST_TURN_EVENTS_NEUTRALIZING_GAS`.
|
||||||
|
* `FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES`.
|
||||||
|
* `FIRST_TURN_EVENTS_OPPORTUNIST_1`.
|
||||||
|
* `FIRST_TURN_EVENTS_ITEM_EFFECTS`.
|
||||||
|
* `FIRST_TURN_EVENTS_OPPORTUNIST_2`.
|
||||||
|
* `FIRST_TURN_EVENTS_END`.
|
||||||
|
|
||||||
|
## 🤹 Moves 🤹
|
||||||
|
### Added
|
||||||
|
* Added missing Ivy Cudgel animation by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5034
|
||||||
|
* Cleanup by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5063
|
||||||
|
* Added missing Axe Kick animation by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/5039
|
||||||
|
### Fixed
|
||||||
|
* Fixed Diamond Storm's Defense increase applying to the target instead of the user by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4947
|
||||||
|
* Fixed Psycho Shift check for Frostbite using `CanBeFrozen` instead of `CanGetFrostbite` by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4995
|
||||||
|
* Fixed Sleep Talk failing on repeated attempts by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5009
|
||||||
|
* Fixed Fury Cutter considering Parental Bond's second hit for its damage multiplier by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5030
|
||||||
|
* Fixed Hidden Power damage category when `B_PHYSICAL_SPECIAL_SPLIT < GEN_4` by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5053
|
||||||
|
* Fixed `MoveEffectRemoveStatus` (Sparkling Aria, Wake-Up Slap, ...) that cure Freeze/Frostbite using the other status' battlescript. by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5061
|
||||||
|
|
||||||
|
## 🎭 Abilities 🎭
|
||||||
|
### Fixed
|
||||||
|
* Fixed Toxic Debris incorrect side check by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5009
|
||||||
|
* Fixed Snow Warning's description not being updated based on `B_SNOW_WARNING` by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/5018
|
||||||
|
* Fixed Mold Breaker abilities not properly checking battler actions in double battles causing them to not work by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5030
|
||||||
|
* Fixed `cantBeSurpressed` ability check for breakable abilities by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/5043
|
||||||
|
* Fixed Stalwart and Propeller Tail not ignoring redirection from Storm Drain/Lightning Rod + tests by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5061
|
||||||
|
* #### Fixed Trace not respecting the speed order like other switch-in abilities by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4941
|
||||||
|
* Changes:
|
||||||
|
* Removed: `ABILITYEFFECT_TRACE1`, `ABILITYEFFECT_TRACE2` and moved their handling to `ABILITYEFFECT_ON_SWITCHIN`.
|
||||||
|
* Removed `gSpecialStatuses`'s `traced` field.
|
||||||
|
|
||||||
|
## 🧶 Items 🧶
|
||||||
|
### Fixed
|
||||||
|
* Jaboca/Rowap Berry recording the wrong item effects by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5009
|
||||||
|
* Fixed Life Orb damaging its holder if it hits itself in confusion. by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5061
|
||||||
|
|
||||||
|
## 🤖 Battle AI 🤖
|
||||||
|
### Documentation
|
||||||
|
* Added AI Flags documentation to directory for new documentation site by @anrichtait in https://github.com/rh-hideout/pokeemerald-expansion/pull/5057
|
||||||
|
### Fixed
|
||||||
|
* Fixed typo that caused AI to use Upper Hand when it shouldn't by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4973
|
||||||
|
* Fixed AI using U-Turn when only the Ace Pokémon is left in the party (#4748) by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4972
|
||||||
|
* Fixed AI not being aware during calculations by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4992
|
||||||
|
* Fixed `AI_SetMoveAccuracy` getting the wrong battler's ability by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5030
|
||||||
|
|
||||||
|
## 🧹 Other Cleanup 🧹
|
||||||
|
### Fixed
|
||||||
|
* Fixed version displayed in `README.md` by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4966
|
||||||
|
* Removes unnecessary checks for Shield Dust and Covert Cloak by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/5073
|
||||||
|
|
||||||
|
## 🧪 Test Runner 🧪
|
||||||
|
### Added
|
||||||
|
* Added AI Upper Hand test by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4973
|
||||||
|
* Added test to make sure that Trainer Class balls apply to every member of the party by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4999
|
||||||
|
* Added missing Sleep Talk tests by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5009
|
||||||
|
### Changed
|
||||||
|
* Improved Test Runner Summary by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4641
|
||||||
|
* Totals are now separated from the erroring test list.
|
||||||
|
* Assumption Fails and Passing `KNOWN_FAILING`s now have their own lists.
|
||||||
|
### Fixed
|
||||||
|
* Fixed tests failing when `B_USE_FROSTBITE` is set to `TRUE` by @fakuzatsu in https://github.com/rh-hideout/pokeemerald-expansion/pull/4986
|
||||||
|
* Fixed tests not compiling outside of CI after incoming pret merge by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4998
|
||||||
|
* Fixed Covert Cloak tests being in `item_effect` folder instead of `hold_effect` folder by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/5073
|
||||||
|
|
||||||
|
## 📦 Pret merges 📦
|
||||||
|
* Pret Merge (13th of July) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4964
|
||||||
|
* Adds the new C-style enums in preproc commit by @SBird1337 [(550e668)](https://github.com/pret/pokeemerald/commit/550e6688aa3b511a9aa9ea851c49ba4d90c7708a)
|
||||||
|
* Pret Merge (27th of July) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/5045
|
||||||
|
* Includes:
|
||||||
|
* [pret#2016](https://github.com/pret/pokeemerald/pull/2016) Fix WSL1 install instructions
|
||||||
|
* [pret#2017](https://github.com/pret/pokeemerald/pull/2017) Added constant for `NUM_SNOWFLAKE_SPRITES`
|
||||||
|
|
||||||
|
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.5...expansion/1.8.6
|
||||||
|
|
||||||
|
<!--Last PR: 5073-->
|
||||||
556
docs/changelogs/1.9.x/1.9.0.md
Normal file
@ -0,0 +1,556 @@
|
|||||||
|
# Version 1.9.0
|
||||||
|
|
||||||
|
```md
|
||||||
|
## How to update
|
||||||
|
- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`.
|
||||||
|
- Once you have your remote set up, run the command `git pull RHH expansion/1.9.0`.
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🌋 *REFACTORS* 🌋
|
||||||
|
📜 = Has a migration script.
|
||||||
|
* [agbcc has been deprecated](#agbcc-has-been-deprecated-by-mrgriffin-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4989)
|
||||||
|
* [Added migration script README](#added-migration-script-readme-by-bassoonian-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4719)
|
||||||
|
* [Removed Gen 9 settings for out-of-battle abilities](#removed-gen-9-settings-for-out-of-battle-abilities-by-asparaguseduardo-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4282)
|
||||||
|
* 📜[Customizable Frontier Pokémon sets](#customizable-frontier-pokémon-sets-by-ghoulslash-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4313)
|
||||||
|
* [Replaced VARARG_8 uses with recursive macros](#replaced-vararg_8-uses-with-recursive-macros-by-cfmnephrite-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4232)
|
||||||
|
* 📜[Competitive-formatted parties](#competitive-formatted-parties-by-mrgriffin-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull3545)
|
||||||
|
* [Terastallization](#terastallization-by-agustingdlv-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4110)
|
||||||
|
* [Combined weather set commands](#combined-weather-set-commands-by-alexon1ine-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4434)
|
||||||
|
* [Full official GF names for species/items/moves/types](#full-official-gf-names-for-speciesitemsmovestypes-by-mrgriffin-znogyrop-and-cfmnephrite-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4241)
|
||||||
|
* [Automatically display TM/HM icons based on their move](#automatically-display-tmhm-icons-based-on-their-move-by-sneed69-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4452)
|
||||||
|
* [Set `GiveBoxMonIntialMoveset_Fast` as default](#set-giveboxmonintialmoveset_fast-as-default-by-alexon1ine-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4470)
|
||||||
|
* [Changed Battle Frontier validation to species flag](#changed-battle-frontier-validation-to-species-flag-by-kittenchilly-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4341)
|
||||||
|
* [Replaced HP checks with `IsBattlerAlive`](#replaced-hp-checks-with-isbattleralive-by-ghoulslash-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4429)
|
||||||
|
* [Removed redundant `MOVE_EFFECT_SP_ATK_TWO_DOWN`](#removed-redundant-move_effect_sp_atk_two_down-by-sneed69-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4557)
|
||||||
|
* 📜[Removed `gItemIconTable`](#removed-gitemicontable-by-kittenchilly-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4579)
|
||||||
|
* 📜[Egg Move Refactor](#egg-move-refactor-by-bassoonian-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4534)
|
||||||
|
* [Adjusted Ate-Ability code a bit to make it more readable](#adjusted-ate-ability-code-a-bit-to-make-it-more-readable-by-alexon1ine-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4640)
|
||||||
|
* [Type Info refactors](#type-info-refactors-by-asparaguseduardo-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4462)
|
||||||
|
* [merrp/aarant's Followers](#merrpaarants-followers)
|
||||||
|
* [Refactored residual damage to be more readable and less prone to bugs](#refactored-residual-damage-to-be-more-readable-and-less-prone-to-bugs-by-alexon1ine-in-httpsgithubcomrh-hideoutpokeemerald-expansionpull4945)
|
||||||
|
|
||||||
|
## 🧬 General 🧬
|
||||||
|
### Added
|
||||||
|
* #### Added migration script README by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4719
|
||||||
|
* #### Customizable Frontier Pokémon sets by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4313
|
||||||
|
* `FacilityMon` has been removed in favor of using regular `TrainerMon`.
|
||||||
|
* Removed `BATTLE_FRONTIER_ITEM_x` item constants in favor of using regular `ITEM_x` constants.
|
||||||
|
* New `CreateFacilityMon` to handle duplicated code.
|
||||||
|
* Added `FLAG_FRONTIER_MON_FACTORY` that replaces Return for Frustration and sets frienship to 0. Used in the Battle Factory.
|
||||||
|
* Converted data in `src/data/battle_frontier/battle_frontier_mons.h` and `src/data/battle_frontier/battle_tent.h`, for example:
|
||||||
|
* `.itemTableId = BATTLE_FRONTIER_ITEM_CHOICE_BAND,` -> `.heldItem = ITEM_CHOICE_BAND,`
|
||||||
|
* `.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,` -> `.ev = TRAINER_PARTY_EVS(0, 252, 0, 252, 0, 0),`
|
||||||
|
* Migration script available in `migration_scripts/egg_move_refactor.py` by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/5040
|
||||||
|
* Added documentation to `STATIC_ASSERTS` used by the `BoxPokemon` after 1.8.0 by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4294
|
||||||
|
* #### Competitive-formatted parties by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/3545
|
||||||
|
* Can be disabled by setting `COMPETITIVE_PARTY_SYNTAX` to `FALSE` in `include/config/general.h`. If migrating from 1.8, remove the first and last lines from `src/data/trainers.h` (`const struct Trainer gTrainers[] = {` and `};` respectively).
|
||||||
|
* Introduces `trainerproc`, a tool which converts Competitive-formatted parties into Trainer Control-formatted parties.
|
||||||
|
* If you made custom changes to the following files and want to use this new format, ***Do not accept the incoming changes for them.*** Instead, use the migration script present in `migration_scripts/convert_parties.py`:
|
||||||
|
- `src/data/trainers.h`
|
||||||
|
- `src/data/trainer_parties.h`
|
||||||
|
- `src/data/battle_partners.h`
|
||||||
|
- `src/data/partner_parties.h`
|
||||||
|
* Before:
|
||||||
|
```c
|
||||||
|
static const struct TrainerMon sTestParty1[] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.species = SPECIES_WOBBUFFET,
|
||||||
|
.ball = ITEM_MASTER_BALL,
|
||||||
|
.ability = ABILITY_TELEPATHY,
|
||||||
|
.friendship = 42,
|
||||||
|
.gender = TRAINER_MON_FEMALE,
|
||||||
|
.heldItem = ITEM_ASSAULT_VEST,
|
||||||
|
.isShiny = TRUE,
|
||||||
|
.iv = TRAINER_PARTY_IVS(25,26,27,28,29,30),
|
||||||
|
.ev = TRAINER_PARTY_EVS(252, 0, 0, 252, 4, 0),
|
||||||
|
.lvl = 67,
|
||||||
|
.moves = {MOVE_AIR_SLASH, MOVE_BARRIER, MOVE_SOLAR_BEAM, MOVE_EXPLOSION},
|
||||||
|
.nature = NATURE_HASTY,
|
||||||
|
.nickname = COMPOUND_STRING("Bubbles")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.species = SPECIES_WOBBUFFET,
|
||||||
|
.ability = ABILITY_SHADOW_TAG,
|
||||||
|
.lvl = 5,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct Trainer sTestTrainer1 =
|
||||||
|
{
|
||||||
|
.trainerName = _("Test1"),
|
||||||
|
.party = TRAINER_PARTY(sTestParty1),
|
||||||
|
};
|
||||||
|
```
|
||||||
|
After:
|
||||||
|
```
|
||||||
|
=== 0 ===
|
||||||
|
Name: Test1
|
||||||
|
|
||||||
|
Bubbles (Wobbuffet) (F) @ Assault Vest
|
||||||
|
Hasty Nature
|
||||||
|
Level: 67
|
||||||
|
Ability: Telepathy
|
||||||
|
IVs: 25 HP / 26 Atk / 27 Def / 29 SpA / 30 SpD / 28 Spe
|
||||||
|
EVs: 252 HP / 4 SpA / 252 Spe
|
||||||
|
Happiness: 42
|
||||||
|
Shiny: Yes
|
||||||
|
Ball: Master Ball
|
||||||
|
- Air Slash
|
||||||
|
- Barrier
|
||||||
|
- Solar Beam
|
||||||
|
- Explosion
|
||||||
|
|
||||||
|
Wobbuffet
|
||||||
|
Level: 5
|
||||||
|
Ability: Shadow Tag
|
||||||
|
```
|
||||||
|
* You can add comments by using `//` or `/* ... */`, like in C.
|
||||||
|
* You're allowed to write `SPECIES_PIKACHU` instead of `Pikachu` (etc etc) if you want.
|
||||||
|
* In addition to the migration script described above, you can add the following to at the top of the `src/data/trainers.party` file to change how the tool interprets the file:
|
||||||
|
- `#pragma trainerproc ivs explicit` — requires an `IVs:` line for every Pokémon instead of defaulting to 31s.
|
||||||
|
- `#pragma trainerproc ivs <IVs>` — changes the default IVs.
|
||||||
|
- `#pragma trainerproc level explicit` — requires a `Level:` line for every Pokémon instead of defaulting to 100.
|
||||||
|
- `#pragma trainerproc level <level>` — changes the default level.
|
||||||
|
- During the merge you could choose to keep your original `src/data/trainers.h` and `src/data/trainer_parties.h` and then run the conversion script to update the `src/data/trainers.party`, `make`, then check in all three files. Alternatively don't run the conversion script and turn off `COMPETITIVE_PARTY_SYNTAX` in `include/config.h`.
|
||||||
|
* Added synonyms for competitive/CFRU species defines, eg:
|
||||||
|
* `SPECIES_PONYTA_GALAR` for `SPECIES_PONYTA_GALARIAN`
|
||||||
|
* `SPECIES_MAUSHOLD_FOUR` for `SPECIES_MAUSHOLD_FAMILY_OF_FOUR`
|
||||||
|
* `SPECIES_CHARIZARD_GMAX` for `SPECIES_CHARIZARD_GIGANTAMAX`
|
||||||
|
* And so.
|
||||||
|
* ***TODO***:
|
||||||
|
- Support `Hidden Power:` to set IVs appropriate for a particular Hidden Power type.
|
||||||
|
- Consider case-insensitivity in the parser.
|
||||||
|
* Cleanup and bugfixes:
|
||||||
|
* By @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4362
|
||||||
|
* By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4366
|
||||||
|
* By @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4374
|
||||||
|
* By @LOuroboros in https://github.com/rh-hideout/pokeemerald-expansion/pull/4397
|
||||||
|
* By @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4421
|
||||||
|
* By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4431
|
||||||
|
* By @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4442
|
||||||
|
* By @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4830
|
||||||
|
* By @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4969
|
||||||
|
* By @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4734
|
||||||
|
* By @innocenthedgehog in https://github.com/rh-hideout/pokeemerald-expansion/pull/4988
|
||||||
|
* By @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4990
|
||||||
|
* By @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/5035
|
||||||
|
* Added `OW_PC_MOVE_ORDER` config to use future generation's menu order for the Pokémon Storage System by @pkmnsnfrn and @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4348
|
||||||
|
* `GEN_1/2/3`: Widthraw -> Deposit -> Move.
|
||||||
|
* `GEN_4/5/6_XY`: Deposit -> Widthraw -> Move.
|
||||||
|
* `GEN_6_ORAS/7/8/9`: Move -> Deposit -> Widthraw.
|
||||||
|
* Added `OW_HIDE_REPEAT_MAP_POPUP` config that doesn't show the Map Popup when transitioning bewteen maps within the same Map Section by Anon822 from Pokécommunity and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4370
|
||||||
|
* Multiple Fishing Enhancements by @ghoulslash and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4343
|
||||||
|
* Added `I_FISHING_CHAIN` config to enable XY's chain fishing.
|
||||||
|
* Added `I_FISHING_PROXIMITY` config to enable XY's proximity mechanic, where fishing away from NPCs increases the chance of a Pokémon being hooked.
|
||||||
|
* Added `I_FISHING_MINIGAME` config to change between minigame versions.
|
||||||
|
* `GEN_1/2` will not require a minigame, and instead automatically hook the Pokémon.
|
||||||
|
* All other settings use RSE's minigame. FRLG/Gen4+'s minigame will be implemented in the future.
|
||||||
|
* Cleanup and bugfixes:
|
||||||
|
* By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4412
|
||||||
|
* By @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4906
|
||||||
|
* By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4718
|
||||||
|
* By @cawtds and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/5031
|
||||||
|
* #### Full official GF names for species/items/moves/types by @mrgriffin, @ZnogyroP and @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/4241
|
||||||
|
* 8-character type names.
|
||||||
|
* 12-character Pokémon names (and nicknames)
|
||||||
|
* 16-character Move names.
|
||||||
|
* 20-character item names.
|
||||||
|
* This is done by introducing 3 new fonts that automatically change the size of the name in vanilla interfaces:
|
||||||
|
* `FONT_NARROWER`, `FONT_SMALL_NARROWER` and `FONT_SHORT_NARROW`.
|
||||||
|
* If the hack has changed fonts—e.g. to the FrLg ones—then they probably want to create their own versions of the new fonts.
|
||||||
|
* If the hack has introduced more UIs that render names they probably want to use `GetFontIdToFit`—see this PR's changes for examples of that.
|
||||||
|
* If the hack has introduced names in list menus they can use `.fontIdMayNarrow = TRUE` on the list template.
|
||||||
|
* Types, species, moves, and items all have individual commits which enable support in the UI and turn on longer names by default. These can be reverted by downstream projects if they really want to.
|
||||||
|
* Cleanup
|
||||||
|
* By @Nopinou in https://github.com/rh-hideout/pokeemerald-expansion/pull/4473
|
||||||
|
* By @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4588
|
||||||
|
* By @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4979
|
||||||
|
* Added `OW_PC_RELEASE_ITEM` config that gives back items from released Pokémon by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4577
|
||||||
|
* If the bag is full, the item is lost, however.
|
||||||
|
* Cleanup by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4844
|
||||||
|
* Added `P_EGG_CYCLE_LENGTH` config that updates the amount of steps required to complete an egg cycle by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4596
|
||||||
|
* Added `trainerbattle_two_trainers` macro to trigger a 1 player vs 2 NPC battle by @aarant and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4741
|
||||||
|
* Added `createmon` Script Command and macro by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4688
|
||||||
|
* This allows to set up wild enemy parties with the same versatility as `givemon` (IVs, EVs, abilities, moves, etc).
|
||||||
|
* Added `setwilddoubleflag` macro to set `sIsScriptedWildDouble` and allow 2 player vs 1 enemy wild battles by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4688
|
||||||
|
* Added support for multiple Roaming Pokémon at once by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4762
|
||||||
|
* By default, `ROAMER_COUNT` is set to 1 to keep save compatibility. Increase it to add more roamers (though this breaks saves).
|
||||||
|
* Added `OW_IGNORE_EGGS_ON_HEAL`, which makes it such that eggs are not counted in the Pokémon Center's heal animation by @ghoulslash @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4888
|
||||||
|
* Added support for fake RTC by Anon822 from PokéCommunity and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4910
|
||||||
|
* When `OW_USE_FAKE_RTC` is `TRUE`, time runs at a different rate from real time, like in Legends: Arceus or Scarlet and Violet.
|
||||||
|
* Use `OW_ALTERED_TIME_RATIO` to set the amount of "time" passing every 60 frames (1 real time second):
|
||||||
|
* `GEN_8_PLA`: 1 minute.
|
||||||
|
* `GEN_9`: 20 seconds.
|
||||||
|
* All other settings make the game synced with real life.
|
||||||
|
* You may also set a flag to pause the RTC (`OW_FLAG_PAUSE_TIME`), and the script commands `pausefakertc`, `resumefakertc` and `togglefakertc` by @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4954
|
||||||
|
* Cleanup by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4965
|
||||||
|
* Added B2W2-style map pop-Ups by @ravepossum, @nielsmittertreiner and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4396
|
||||||
|
* Change `OW_POPUP_GENERATION` to `GEN_5` to switch existing map popups.
|
||||||
|
* You may choose between Black or White themes via `OW_POPUP_BW_COLOR` (`OW_POPUP_BW_COLOR_BLACK` or `OW_POPUP_BW_COLOR_WHITE`).
|
||||||
|
* You may choose to display the current time in the pop-up using `OW_POPUP_BW_TIME_MODE`.
|
||||||
|
* `OW_POPUP_BW_TIME_NONE`: Disables time in pop-up.
|
||||||
|
* `OW_POPUP_BW_TIME_12_HR`: Shows 12-hour time in pop-up
|
||||||
|
* `OW_POPUP_BW_TIME_24_HR`: Shows 24-hour time in pop-up
|
||||||
|
* You may enable alpha blending via `OW_POPUP_BW_ALPHA_BLEND` (mainly designed around the Black theme).
|
||||||
|
* Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4752
|
||||||
|
* Allowed flags to be used in trigger scripts instead of vars by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4900
|
||||||
|
### Changed
|
||||||
|
* #### agbcc has been deprecated by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4989
|
||||||
|
* You technically still use `make agbcc` by disabling the error thrown when using it, but it will be removed completely for version 1.10.
|
||||||
|
* #### Moved general config file to the config folder by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4805
|
||||||
|
* `config.h` -> `config/general.h`
|
||||||
|
* Cleanup by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5026
|
||||||
|
* #### Set `GiveBoxMonIntialMoveset_Fast` as default by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4470
|
||||||
|
* #### Changed Battle Frontier validation to species flag by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4341
|
||||||
|
* Added `isFrontierBanned` flag and removed `gFrontierBannedSpecies`.
|
||||||
|
* Renamed `isParadoxForm` -> `isParadox`.
|
||||||
|
* #### Unified Nature info by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4562
|
||||||
|
* All data is now found on `gNaturesInfo` in `src/pokemon.c`
|
||||||
|
* Names, Stat Up/Down, Back Sprite animation, Pokéblock animation, Nature Girl message and Battle Palace data.
|
||||||
|
* Cleanup by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4598
|
||||||
|
* #### Type Info refactors by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4462
|
||||||
|
* Added `src/data/types_info.h` file for `gTypesInfo` instead of `src/battle_main.c`.
|
||||||
|
* Moved `sTypeEffectivenessTable` here file as well (and renamed it to `gTypeEffectivenessTable`)
|
||||||
|
* `TYPE_NONE` duplicates graphics from `TYPE_MYSTERY` due to limitations with `graphics_file_rules.mk`.
|
||||||
|
* Damage Categories for `B_PHYSICAL_SPECIAL_SPLIT`'s pre-Gen4 setting can now be specified in this `gTypesInfo`'s `damageCategory` field instead of depending on the type's order.
|
||||||
|
* Consolidated Lilycove Contest Lady's values into one struct (`sContestLadyValues`) by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4951
|
||||||
|
* Applied the Pokémon Sprite Visualizer name officially by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4745
|
||||||
|
* Don't specify `sDexSearchTypeOptions` array size by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4820
|
||||||
|
* Prevents Type search in the dex from breaking when non-conventional types are added.
|
||||||
|
* Only call RNG once when generating IVs in some cases by @tertu-m in https://github.com/rh-hideout/pokeemerald-expansion/pull/4876
|
||||||
|
### Fixed
|
||||||
|
* Fixed potential Wireless Adapter desynchronization by @AtariDreams in https://github.com/rh-hideout/pokeemerald-expansion/pull/3730
|
||||||
|
* Fixed `ListItemTemplate` UB in the Pokémon Center by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4725
|
||||||
|
* Fixed `src/data/map_group_count.h` not being ignored in `.gitignore` properly by @rayrobdod in https://github.com/rh-hideout/pokeemerald-expansion/pull/4727
|
||||||
|
* Fixed double battles not occuring with only one Pokemon by talking to the trainers despite `OW_DOUBLE_APPROACH_WITH_ONE_MON` being set `TRUE` by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4848
|
||||||
|
* Fixed unused `B_TRANSITION_SHRED_SPLIT` from softlocking the game by @Lunos, @griffinr and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4919
|
||||||
|
|
||||||
|
## ✨ Feature Branches ✨
|
||||||
|
### ***merrp/aarant's Followers***
|
||||||
|
* Integrated @aarant's followers branch by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4022
|
||||||
|
* This includes Dynamic Overworld Palettes and Expanded Overworld IDs.
|
||||||
|
* This does ***not*** include the `lighting` branch yet, but will be included in a future version.
|
||||||
|
* Updated up to the latest version of the branch (11th of July) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4944
|
||||||
|
* Cleanup
|
||||||
|
* By @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4782
|
||||||
|
* By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4937
|
||||||
|
#### Changes from the original branch
|
||||||
|
* Follower Pokémon can be enabled using the `OW_FOLLOWERS_ENABLED` config.
|
||||||
|
* Pokémon NPCs can be added to a map [independently](https://github.com/rh-hideout/pokeemerald-expansion/pull/4761) from the Followers config. Keep in mind, this requires `OW_POKEMON_OBJECT_EVENTS` to be enabled in order to add the graphics to the ROM.
|
||||||
|
* Eg: use `OBJ_EVENT_GFX_SPECIES(CHARIZARD)` where the graphic ID would go (`OBJ_EVENT_GFX_SPECIES_SHINY()` for shiny version).
|
||||||
|
* May also use `OBJ_EVENT_GFX_SPECIES_SHINY(CHARIZARD)` to make them shiny by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/5049
|
||||||
|
* Moved original configs from `include/constants/event_objects.h` to `include/config/overworld.h` and renamed them:
|
||||||
|
* `OW_MON_BOBBING` -> `OW_FOLLOWERS_BOBBING`
|
||||||
|
* `LARGE_OW_SUPPORT` -> `OW_LARGE_OW_SUPPORT`
|
||||||
|
* `OW_MON_POKEBALLS` -> `OW_FOLLOWERS_POKEBALLS`
|
||||||
|
* Added follower Pokémon sprites from Gen 4-8
|
||||||
|
* Credits to @Eemeliri and Gerben BSc
|
||||||
|
* Moved `OW_GFX_COMPRESS` from `include/global.h` to `include/config/overworld.h`.
|
||||||
|
* Added `OW_SUBSTITUTE_PLACEHOLDER` config to hide followers if they don't have a follower sprite instead of using a placeholder Substitute sprite by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4765
|
||||||
|
* Follower graphics are shown in the Pokémon Sprite Visualizer.
|
||||||
|
* Follower graphics have been moved to the respective species graphics folder instead of all being grouped in `graphics/object_events/pics/pokemon`.
|
||||||
|
* Eg: `graphics/object_events/pics/pokemon/abomasnow.png` was moved to `graphics/pokemon/abomasnow/follower.png`.
|
||||||
|
* Follower data has been moved to `gSpeciesInfo`
|
||||||
|
* Their palettes are separate from the battle sprite palettes
|
||||||
|
* Can be enabled using `OW_FOLLOWERS_SHARE_PALETTE`, but requires manual sprite adjustements. For now, it's recommended to keep this `FALSE`. (They don't use much space anyway)
|
||||||
|
* Updated `GetTypeEffectiveness` used by follower messages to account for new abilities with type immunities.
|
||||||
|
* Cleaned up code style to match pret/expansion's.
|
||||||
|
* Reverted Regi's sprite to vanilla's.
|
||||||
|
* Follower PicTables use `overworld_ascending_frames` macro.
|
||||||
|
* Removed unneeded calls to `bufferspeciesname`.
|
||||||
|
* Removed `MON_DATA_NATURE`.
|
||||||
|
* Removed debug functions like `IsAccurateGBA`.
|
||||||
|
* Removed `ScrCmd_callfunc` to use `callnative`s instead
|
||||||
|
|
||||||
|
## 🐉 Pokémon 🐉
|
||||||
|
### Added
|
||||||
|
* Added `EVO_ITEM_COUNT_999` evolution method (used by Gimmighoul) by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4261
|
||||||
|
* Requires level up while carrying 999 of the specified item in the bag, which will be consumed.
|
||||||
|
* Uses new `EVO_MODE_CANT_STOP` mode, which is a clone of `EVO_MODE_NORMAL` but prevents evolution from being canceled.
|
||||||
|
* Added `EVO_DEFEAT_THREE_WITH_ITEM` evolution method (used by Bisharp) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4768
|
||||||
|
* Requires level up after defeating 3 Pokémon of the same species holding the specified item.
|
||||||
|
* Eg: Bisharp defeating 3 other Bisharp holding Leader Crests.
|
||||||
|
* Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/5046
|
||||||
|
* Added `EVO_OVERWORLD_STEPS` evolution method (used by Pawmo, Bramblin and Rellor) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4758
|
||||||
|
* Requires level up after walking the specified amount of steps with that Pokémon as the first member in the party without switching.
|
||||||
|
* Switching the party leader resets the steps.
|
||||||
|
* Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/5047
|
||||||
|
* Added `FORM_CHANGE_DAYS_PASSED` form change (used by Furfrou and Hoopa) by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4778
|
||||||
|
* Adds `MON_DATA_DAYS_SINCE_FORM_CHANGE`, which is a timer to automatically changes forms at midnight once it runs out. It is set after a different form change has been made (currently only added to Form Change items, including Prison Bottle)
|
||||||
|
* Added unique icons for all of Arceus's forms via config (`P_ARCEUS_UNIQUE_FORM_ICONS`) by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4329
|
||||||
|
* Added `P_TWO_FRAME_FRONT_SPRITES` config to allow disabling 2-frame front animations by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4750
|
||||||
|
* Added `P_CRIES_ENABLED` config to disable species cries and stop them from being included in the ROM by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4791
|
||||||
|
* Added configs to prevent unobtainable Pokemon from being shiny by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4735
|
||||||
|
* `P_ONLY_OBTAINABLE_SHINIES`: Prevents shinies from generating in the Battle Pyramid.
|
||||||
|
* `P_NO_SHINIES_WITHOUT_POKEBALLS`: Prevents shinies from generating if the player has no Poké Balls.
|
||||||
|
* Added `P_CAN_FORGET_HIDDEN_MOVE` config allow Pokémon to forget HM moves by @pkmnsnfrn and @Lunos in https://github.com/rh-hideout/pokeemerald-expansion/pull/4968
|
||||||
|
### Changed
|
||||||
|
* Renamed evolution methods the were labeled as evo level by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4607
|
||||||
|
* `EVO_LEVEL_MOVE_TWENTY_TIMES` -> `EVO_MOVE_TWENTY_TIMES`
|
||||||
|
* `EVO_LEVEL_RECOIL_DAMAGE_MALE` -> `EVO_RECOIL_DAMAGE_MALE`
|
||||||
|
* `EVO_LEVEL_RECOIL_DAMAGE_FEMALE` -> `EVO_RECOIL_DAMAGE_FEMALE`
|
||||||
|
* Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4644
|
||||||
|
* Evolution tracker is now by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4758
|
||||||
|
* #### Replaced VARARG_8 uses with recursive macros by @cfmnephrite in https://github.com/rh-hideout/pokeemerald-expansion/pull/4232
|
||||||
|
* #### Egg Move Refactor by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4534
|
||||||
|
* Egg Moves are now formatted like Teachable learnsets and their pointers are stored in `gSpeciesInfo`, as opposed to having one big array.
|
||||||
|
* Only offspring require these tables.
|
||||||
|
* Migration script available in `migration_scripts/egg_move_refactor.py`.
|
||||||
|
|
||||||
|
## ⚔️ Battle General ⚔️ ##
|
||||||
|
### Added
|
||||||
|
* Added option to increase Experience bar speed via `B_FAST_EXP_GROW` by @SonikkuA-DatH and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4335
|
||||||
|
* Added Gen 4's Fog battle weather by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4359
|
||||||
|
* Uses Haze's animation.
|
||||||
|
* Changes `B_FOG_TERRAIN` (TRUE/FALSE config) into `B_OVERWORLD_FOG` (Generational config).
|
||||||
|
* `GEN_4`: Uses this battle weather in maps with `WEATHER_FOG_DIAGONAL` and `WEATHER_FOG_HORIZONTAL`.
|
||||||
|
* `GEN_8` onwards: Sets permanent Misty Terrain.
|
||||||
|
* All others disable them.
|
||||||
|
* #### Terastallization by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4110
|
||||||
|
* Tera Type automatically assigned to existing Pokémon based on their personality value.
|
||||||
|
* Can get and set Tera Types in scripts for party members using `checkteratype` and `setteratype` by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4460
|
||||||
|
* To activate, it requires:
|
||||||
|
* `ITEM_TERA_ORB` to be in the player's bag.
|
||||||
|
* `B_FLAG_TERA_ORB_CHARGED` to be set up to an unused flag. It¿s automatically set when `HealPlayerParty` is called.
|
||||||
|
* Added `ignoreTera` argument added to `GetBattlerType`
|
||||||
|
* Added Tera Blast's effect.
|
||||||
|
* Changes type shown in battle screen if the mon is Terastalized or about to by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4447
|
||||||
|
* Added Stellar Type.
|
||||||
|
* Added `teraType` option for Trainers (also supported by Competitive Format Parties)
|
||||||
|
* Added Tera Starstorm's effect by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4447
|
||||||
|
* Terastallization animation by @Pokabbie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4507
|
||||||
|
* Added `forceTeraType` field for `gSpeciesInfo`, which forces the Pokémon to have a specific Tera Type (used by Terapagos and Ogerpon) by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4438
|
||||||
|
* Added `FORM_CHANGE_BATTLE_TERASTALLIZATION` by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4438
|
||||||
|
* It uses a Pokémon's Tera Type to choose which form to switch to upon Terastallizing.
|
||||||
|
* Bugfixes:
|
||||||
|
* By @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4435
|
||||||
|
* By @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4440
|
||||||
|
* By @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4513
|
||||||
|
* By @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4515
|
||||||
|
* By @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4529
|
||||||
|
* By @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4975
|
||||||
|
* Added Gen 1 type matchups by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4508
|
||||||
|
* Renamed `B_STEEL_RESISTANCES` -> `B_UPDATED_TYPE_MATCHUPS` to reflect this change.
|
||||||
|
* Added defines to cleanup `sTypeEffectivenessTable`.
|
||||||
|
* Added Move Descriptions in battle by @Bassoonian, @TheXaman, @Pawkkie and @ravepossum in https://github.com/rh-hideout/pokeemerald-expansion/pull/4152
|
||||||
|
* Press L before selecting a move to see their category, power, accuracy and description.
|
||||||
|
* This can be changed to R by using the `B_MOVE_DESCRIPTION_BUTTON` config by @fakuzatsu in https://github.com/rh-hideout/pokeemerald-expansion/pull/4860
|
||||||
|
* Cleanup
|
||||||
|
* By @AGSMGMaster64 and @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4678
|
||||||
|
* Added ball throwing configs by セケツ from PokéCommunity and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4953
|
||||||
|
* `B_ENEMY_THROW_BALLS`: When set to `GEN_6` or higher, it changes the opposing trainer's ball animation so they throw their Pokéballs instead of already starting on the floor.
|
||||||
|
* `B_PLAYER_THROW_BALLS_SOUND`: When set to `GEN_5` or higher, it plays `SE_BALL_THROW` as part of the player's ball throw animation.
|
||||||
|
* `B_ENEMY_THROW_BALLS_SOUND`: When set to `GEN_5` or higher, it plays `SE_BALL_THROW` as part of the enemy's ball throw animation.
|
||||||
|
* Added `RandomChance` macro for battle/test randomization by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4829
|
||||||
|
* #### Gimmick Refactor by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4449
|
||||||
|
* Unifies generational mechanics into `gGimmicksInfo` struct (Mega, Z-Moves, Ultra Burst, Dynamax, Terastallization).
|
||||||
|
* Contains triggers, indicator, condition and function to execute when triggered.
|
||||||
|
* Around ~500-1000 lines of redundant / duplicate code removed!
|
||||||
|
* Cleanup
|
||||||
|
* By @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4927
|
||||||
|
* By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4962
|
||||||
|
* By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4863
|
||||||
|
* By @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4960
|
||||||
|
* Allow users to increase `MAX_MONEY` dynamically by @DizzyEggg and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4943
|
||||||
|
* Added `AUTO_LOWERCASE_KEYBOARD` by @Jaizu and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4976
|
||||||
|
* Automatically changes to to lowercase if the first character inputted is uppercase.
|
||||||
|
### Changed
|
||||||
|
* Improved HP drain when enabling `B_FAST_HP_DRAIN` by @pkmnsnfrn and @SonikkuA-DatH in https://github.com/rh-hideout/pokeemerald-expansion/pull/4335
|
||||||
|
* #### Combined weather set commands by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4434
|
||||||
|
* `setrain` -> `setfieldweather ENUM_WEATHER_RAIN`.
|
||||||
|
* `setsandstorm` -> `setfieldweather ENUM_WEATHER_SANDSTORM`.
|
||||||
|
* `setsunny` -> `setfieldweather ENUM_WEATHER_SUN`.
|
||||||
|
* `sethail` -> `setfieldweather ENUM_WEATHER_HAIL`.
|
||||||
|
* `setsnow` -> `setfieldweather ENUM_WEATHER_SNOW`.
|
||||||
|
* #### Replaced HP checks with `IsBattlerAlive` by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4429
|
||||||
|
* #### Removed redundant `MOVE_EFFECT_SP_ATK_TWO_DOWN` by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4557
|
||||||
|
* Added stack for saved targets and attackers by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4061
|
||||||
|
* This avoids the need to overwriting battler IDs during scripts and cause potential issues.
|
||||||
|
* Several scripts have been updated to use these.
|
||||||
|
* Cleanup and fixes
|
||||||
|
* By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4653
|
||||||
|
* By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4668
|
||||||
|
* #### Adjusted Ate-Ability code a bit to make it more readable by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4640
|
||||||
|
* Added global constants for damage rolls by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4663
|
||||||
|
```c
|
||||||
|
// Lowest and highest percentages used for damage roll calculations
|
||||||
|
#define DMG_ROLL_PERCENT_LO 85
|
||||||
|
#define DMG_ROLL_PERCENT_HI 100
|
||||||
|
```
|
||||||
|
* #### Refactored residual damage to be more readable and less prone to bugs by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4945
|
||||||
|
* Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4993
|
||||||
|
* Clarified some cases of `ChangeStatBuffs` usage by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4826
|
||||||
|
* Moved EWRAM variables from battle controller player file to gBattleStruct by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4840
|
||||||
|
* `sDescriptionSubmenu`, `sAckBallUseBtn` and `sBallSwapped`.
|
||||||
|
### Fixed
|
||||||
|
* Fixed Dynamax data not clearing when a battler faints by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4672
|
||||||
|
* Multiple Z-Move fixes by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4449
|
||||||
|
* Fixed Z-Moves not working in Link Battles, recorded battles and tests.
|
||||||
|
* Fixed `Z_EFFECT_ALL_STATS_UP` functionality.
|
||||||
|
* Fixed Z-Nature Power, Z-Copycat, Z-Me First, and Z-Sleep Talk incorrectly using a normal move and not a Z-Move, ~~which had not been raised as an issue yet.~~ (some of these were caught recently!)
|
||||||
|
* Fixed Breakneck Blitz incorrectly being affected by -ate abilities, which had not been raised as an issue yet.
|
||||||
|
* Fixed Instruct incorrectly not failing if the target last used a Z-Move, which had not been raised as an issue yet.
|
||||||
|
* Fixed Guardian of Alola incorrectly doing 50% of the target's HP instead of 75%.
|
||||||
|
* Fixed Enemy Data not clearing at the end of battles by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4867
|
||||||
|
|
||||||
|
## 🤹 Moves 🤹
|
||||||
|
### Added
|
||||||
|
* Expanded Freeze Dry's effect to use `argument` field and allow custom moves to use the effect to be super effective to any specific type by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4312
|
||||||
|
* Renamed `EFFECT_FREEZE_DRY` to `EFFECT_SUPER_EFFECTIVE_ON_ARG`.
|
||||||
|
* Expanded `EFFECT_BODY_PRESS` to use category of defense stats for calculation based on the move's own damage category by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4312
|
||||||
|
* Eg: In vanilla, Body Press uses the user's Defense and its stat changes instead of Attack. Now, if we were to change its `category` in `gMovesInfo`, it'll use Sp. Defense and its stat changes instead of Sp. Attack.
|
||||||
|
* Expanded Photon Geyser and Shell Side Arm (restored) effects so that they also work for physical moves by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4923
|
||||||
|
* Added Knock Off's Gen 5+ effect with config (`B_KNOCK_OFF_REMOVAL`) by @AgustinGDLV in https://github.com/rh-hideout/pokeemerald-expansion/pull/4333
|
||||||
|
* Items are removed outright instead of making them unusable.
|
||||||
|
* Added Heal Bell/Soundproof Gen 5-8+ interactions with `B_HEAL_BELL_SOUNDPROOF` config by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4732
|
||||||
|
* Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/5060
|
||||||
|
* Added Spicy Extract's effect by @AlexOn1ine, @Skeli789, @kittenchilly and @ZnogyroP in https://github.com/rh-hideout/pokeemerald-expansion/pull/4211
|
||||||
|
* Added `B_RETURN_STOLEN_NPC_ITEMS` config for Covet/Thief not being able to steal from NPCs by @moostoet and @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4605
|
||||||
|
* Added Dragon Darts effect (CFRU port) by @AlexOn1ine, @Skeli789 and @BuffelSaft in https://github.com/rh-hideout/pokeemerald-expansion/pull/4612
|
||||||
|
* Animation by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4620
|
||||||
|
### Changed
|
||||||
|
* `EFFECT_TRIPLE_KICK`'s base power uses the move's `strikeCount` instead of a constant by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4608
|
||||||
|
* This allows users to create "Quadruple Kick" and similar moves.
|
||||||
|
* Migrated move animation pointers to `gMovesInfo` by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4683
|
||||||
|
* This removes the need for `gBattleAnims_Moves` which had potential ordering issues if not kept in line with move IDs.
|
||||||
|
* If `battleAnimScript` is not defined for a move, it defaults to Tackle's animation.
|
||||||
|
* Migration script available in `migration_scripts/battle_anim_moves_refactor.py`
|
||||||
|
### Fixed
|
||||||
|
* Multiple Ally Switch fixes by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4451
|
||||||
|
* Shadows no longer disappear + safety checks.
|
||||||
|
* Corrected animation for opponents.
|
||||||
|
* Fixed Avalanche's target by @TheLastMudkip in https://github.com/rh-hideout/pokeemerald-expansion/pull/4581
|
||||||
|
* Fixed Feint and Feint Attack's descriptions by @lhearachel in https://github.com/rh-hideout/pokeemerald-expansion/pull/4617
|
||||||
|
* Fixed Mud Sport/Water Sport reducing damage by 77% instead of 67% in Gen5+ by @fdeblasio in https://github.com/rh-hideout/pokeemerald-expansion/pull/4874
|
||||||
|
|
||||||
|
## 🎭 Abilities 🎭
|
||||||
|
### Added
|
||||||
|
* Added Poison Puppeteer's effect by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4416
|
||||||
|
* Added Tera Shift, Tera Shell, and Teraform Zero by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4418
|
||||||
|
* `FORM_CHANGE_BATTLE_SWITCH` now has ability as optional parameter.
|
||||||
|
* Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4742
|
||||||
|
* Added Toxic Chain's effect by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4823
|
||||||
|
* Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4843
|
||||||
|
* Added `B_ABILITY_TRIGGER_CHANCE` config to update trigger chances of abilities to Gen4+ by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4829
|
||||||
|
* Shed Skin, Cute Charm, Flame Body, Static and Poison Point have a 30% chance to trigger in Gen4+ instead of 1/3 in Gen3.
|
||||||
|
* Effect Spore has an 11%, 10% and 9% chance of triggering Sleep, Paralysis and Poison in Gen4+ instead of equal 10% each in Gen3.
|
||||||
|
### Changed
|
||||||
|
* #### Removed Gen 9 settings for out-of-battle abilities by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4282
|
||||||
|
* These configs no longer disable out-of-battle ability effects when set to `GEN_9`.
|
||||||
|
* `OW_SUPER_LUCK`.
|
||||||
|
* `OW_INFILTRATOR`.
|
||||||
|
* `OW_HARVEST`.
|
||||||
|
* `OW_LIGHTNING_ROD`.
|
||||||
|
* `OW_STORM_DRAIN`.
|
||||||
|
* `OW_FLASH_FIRE`.
|
||||||
|
* These configs have been removed
|
||||||
|
* `OW_COMPOUND_EYES`.
|
||||||
|
* `OW_CUTE_CHARM`.
|
||||||
|
* `OW_ILLUMINATE`.
|
||||||
|
* `OW_MAGNET_PULL`.
|
||||||
|
* `OW_STATIC`.
|
||||||
|
### Fixed
|
||||||
|
* Fixed Mirror Armor bouncing Sticky Web's stat reduction to the opponent by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4713
|
||||||
|
* Effect Spore now uses `B_POWDER_GRASS` to toggle Grass-type Pokémon immunity to it by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4829
|
||||||
|
|
||||||
|
## 🧶 Items 🧶
|
||||||
|
### Added
|
||||||
|
* Added Booster Energy's effect by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4337
|
||||||
|
* Cleanup
|
||||||
|
* By @PCG06 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4354
|
||||||
|
* By @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4804
|
||||||
|
### Changed
|
||||||
|
* #### Removed `gItemIconTable` by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4579
|
||||||
|
* Sprite and palette pointers have been moved to `gItemsInfo` as `iconPic` and `iconPalette` respectively.
|
||||||
|
* Migration script available in `migration_scripts/convert_item_icons.py`
|
||||||
|
* Cleanup
|
||||||
|
* By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4591
|
||||||
|
* By @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4658
|
||||||
|
* #### Automatically display TM/HM icons based on their move by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4452
|
||||||
|
* TM palettes are now stored in `gTypesInfo` in the `paletteTMHM` field.
|
||||||
|
* Cleanup by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4487
|
||||||
|
|
||||||
|
## 🤖 Battle AI 🤖
|
||||||
|
### Added
|
||||||
|
* Added `AI_GetBattlerAbility` by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4555
|
||||||
|
* Added `AI_FLAG_CONSERVATIVE` flag by @Pawkkie and @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4615
|
||||||
|
* AI will assume low damage rolls for its `calculationsDamage` roll selection in `AI_CalcDamage`
|
||||||
|
* Cleanup
|
||||||
|
* By @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4663
|
||||||
|
* Added `AI_FLAG_SEQUENCE_SWITCHING` flag by @Pawkkie, Kasen, @pkmnsnfrn and @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/4878
|
||||||
|
* AI will keep their party order consistently with switches.
|
||||||
|
* Added `setdynamicaifunc`, which allows to setup custom AI functions before a battle besides the predetermined ones used by AI Flags @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4908
|
||||||
|
* Eg:
|
||||||
|
```
|
||||||
|
setdynamicaifunc AI_TagBattlePreferFoe
|
||||||
|
multi_2_vs_2 TRAINER_MAXIE_MOSSDEEP, MossdeepCity_SpaceCenter_2F_Text_JustWantToExpandLand, TRAINER_TABITHA_MOSSDEEP, MossdeepCity_SpaceCenter_Text_TabithaDefeat, PARTNER_STEVEN
|
||||||
|
```
|
||||||
|
Where `AI_TagBattlePreferFoe` prioritizes attacking the opposite battler index.
|
||||||
|
### Changed
|
||||||
|
* AI now calculates and stores minimum possible move damage and uses it with `AI_FLAG_TRY_TO_FAINT` by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4760
|
||||||
|
* This allows AI to prefer guaranteed KO moves over highest expected damage move.
|
||||||
|
* Cleanup by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4808
|
||||||
|
* AI Revenge Killer switching factors in Trick Room by @Shadowzlmao and @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4794
|
||||||
|
* AI Smarter Choice AI for Status Moves by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4872
|
||||||
|
* Better behavior for AI under Choice Item effects.
|
||||||
|
* Cleanup by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4911
|
||||||
|
* AI Smarter Focus Punch and Substitute handling by @Pawkkie, @Kasenn and @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4952
|
||||||
|
* Moved `RestoreBattlerData` out of `Ai_CalcDmg` and added `SaveBattlerData` Protections by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4156
|
||||||
|
* Cleanup
|
||||||
|
* By @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4586
|
||||||
|
* Made AI see Loaded Dice hold effect for multi hit moves that strike 5 times by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4622
|
||||||
|
* `AI_FLAG_RISKY` Improvements by @Pawkkie, @AlexOn1ine and @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4648
|
||||||
|
* Check the PR for in depth details.
|
||||||
|
* Cleanup
|
||||||
|
* By @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4790
|
||||||
|
* By @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/5032
|
||||||
|
* Removed temporary scores in `AI_CalcMoveEffectScores` by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4655
|
||||||
|
* Changed `AI_IS_SLOWER` and `AI_IS_FASTER` comparisons into `AI_IsFaster` and `AI_IsSlower` functions by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4671
|
||||||
|
* `AI_STRIKES_FIRST` is also replaced by `AI_IsFaster`.
|
||||||
|
* Switch AI uses trapping abilities aggressively by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4669
|
||||||
|
* Use 9th roll instead of average in AI calcs by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4679
|
||||||
|
* Use `AI_DATA->abilities` in more places by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4729
|
||||||
|
* Minor switch AI cleanup by @Pawkkie, @DizzyEggg, @AlexOn1ine and @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4849
|
||||||
|
* Removed `SetBattlerData` from `AI_CalcDamage` by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4881
|
||||||
|
* Removed unused `AI_FLAG_HELP_PARTNER` by @pkmnsnfrn and @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4918
|
||||||
|
* Added missing `ADJUST_SCORE`s by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4925
|
||||||
|
* Reduced `AI_WhoStrikesFirst` to the most essential parts by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4978
|
||||||
|
* Changed score adjustments to `tempScore` increases by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4987
|
||||||
|
### Fixed
|
||||||
|
* Minor AI flag fixes/cleanup by @Pawkkie, @AlexOn1ine and @pkmnsnfrn in https://github.com/rh-hideout/pokeemerald-expansion/pull/4924
|
||||||
|
|
||||||
|
## 🧹 Other Cleanup 🧹
|
||||||
|
### Changed
|
||||||
|
* Corrected species info struct hex comments by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4798
|
||||||
|
* Cleanup by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4800
|
||||||
|
|
||||||
|
## 🧪 Test Runner 🧪
|
||||||
|
### Added
|
||||||
|
* Added missing weather tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4434
|
||||||
|
* Added missing Gale Wings test by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4694
|
||||||
|
* Added `SWITCH_OUT_MESSAGE` and `SEND_IN_MESSAGE` macros to avoid tests from failing based on changing switch out/in messages by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4717
|
||||||
|
* Usage: `SEND_IN_MESSAGE("Wobbuffet");`
|
||||||
|
* Tests have been updated to use these new macros.
|
||||||
|
* Added missing Hidden Power test by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4462
|
||||||
|
* Added some Terastallization tests by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5020
|
||||||
|
### Changed
|
||||||
|
* Cleaned up Frisk test by @mrgriffin in https://github.com/rh-hideout/pokeemerald-expansion/pull/4441
|
||||||
|
* Renamed `MgbaPrintf_` to `Test_MgbaPrintf` by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4642
|
||||||
|
* AI tests have been moved to their own folder by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4898
|
||||||
|
* Species are now always included in tests by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4810
|
||||||
|
* Added Battle Anim Debug Check to see if animations aren't cleared by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4930
|
||||||
|
* Test battlers always have their forced abilities to prevent them from changing during a test by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4707
|
||||||
|
### Fixed
|
||||||
|
* Test runner uses Set mode to avoid an issue where tests prompted switching and caused a timeout by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4661
|
||||||
|
|
||||||
|
## New Contributors
|
||||||
|
* @Pokabbie made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4507
|
||||||
|
* @TheLastMudkip made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4581
|
||||||
|
* @moostoet made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4605
|
||||||
|
* @rayrobdod made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4727
|
||||||
|
* @innocenthedgehog made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4988
|
||||||
|
|
||||||
|
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.5...expansion/1.9.0
|
||||||
|
|
||||||
|
<!--Last PR: 5060-->
|
||||||
140
docs/changelogs/1.9.x/1.9.1.md
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
# Version 1.9.1
|
||||||
|
|
||||||
|
```md
|
||||||
|
## How to update
|
||||||
|
- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`.
|
||||||
|
- Once you have your remote set up, run the command `git pull RHH expansion/1.9.1`.
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🌋 *REFACTORS* 🌋
|
||||||
|
* Removed `ENDTURN_RETALIATE` in [#5182](https://github.com/rh-hideout/pokeemerald-expansion/pull/5182)
|
||||||
|
* Removed `ENDTURN_WEATHER_FORM` and `allowedToChangeFormInWeather` in [#5171](https://github.com/rh-hideout/pokeemerald-expansion/pull/5171)
|
||||||
|
|
||||||
|
## 🧬 General 🧬
|
||||||
|
### Added
|
||||||
|
* Move Relearner UI now displays move category by @kittenchilly in [#5081](https://github.com/rh-hideout/pokeemerald-expansion/pull/5081)
|
||||||
|
### Fixed
|
||||||
|
* Fixes wrong padding field in `SpeciesInfo` struct by @AlexOn1ine in [#5139](https://github.com/rh-hideout/pokeemerald-expansion/pull/5139)
|
||||||
|
* Fixed specific tiles changing to PC tiles when using Box Link/Debug PC option by @cawtds in [#5141](https://github.com/rh-hideout/pokeemerald-expansion/pull/5141)
|
||||||
|
|
||||||
|
## 🐉 Pokémon 🐉
|
||||||
|
### Fixed
|
||||||
|
* Fixed stray transparent pixels in Urshifu sprites by @hedara90 in [#5071](https://github.com/rh-hideout/pokeemerald-expansion/pull/5071)
|
||||||
|
* Fixed `bufferspeciesname` not working for species IDs over 1023 by @SBird1337 in [#5088](https://github.com/rh-hideout/pokeemerald-expansion/pull/5088)
|
||||||
|
* Fixed overworld Pokémon breaking for species IDs above 1535 by @hedara90, @mrgriffin and
|
||||||
|
@SarnPoke in [#5179](https://github.com/rh-hideout/pokeemerald-expansion/pull/5179)
|
||||||
|
* Fixed overworld palettes for multiple species by @hedara90 in [#5107](https://github.com/rh-hideout/pokeemerald-expansion/pull/5107)
|
||||||
|
* Dialga Origin (Normal and Shiny)
|
||||||
|
* Palkia Origin (Normal and Shiny)
|
||||||
|
* Giratina Origin (shiny palette fixed by @hedara90 in [#5108](https://github.com/rh-hideout/pokeemerald-expansion/pull/5108))
|
||||||
|
* Xerneas Neutral/Active (Normal and Shiny)
|
||||||
|
* Enamorus Incarnate/Therian (Normal and Shiny)
|
||||||
|
* Fixed/added missing Pokémon sprites and palettes by @Cafeei in [#5126](https://github.com/rh-hideout/pokeemerald-expansion/pull/5126)
|
||||||
|
* Overworld:
|
||||||
|
* Shiny Sneasler, Morelul, Bounsweet, Bruxish, Guzzlord, Regieleki, Zacian, Zamazenta
|
||||||
|
* Hisuian Zorua sprite
|
||||||
|
* Shiny Summer Sawsbuck
|
||||||
|
* Shiny Galarian Yamask, Darumaka, Zigzagoon, Zapdos, Ponyta, Rapidash, Slowpoke, Farfetch'd, Weezing, Mr. Mime, Articuno, Moltres, Slowking, Stunfisk, Darmanitan
|
||||||
|
* Shiny Hisuian Sneasel, Qwilfish, Samurott,
|
||||||
|
* Battle sprites:
|
||||||
|
* Shiny Sneasler, Cursola, Pincurchin, Runerigus
|
||||||
|
* Shiny Galarian Yamask, Darumaka
|
||||||
|
* Fixed Unown Overworld follower sprites by Sarn by @hedara90 in [#5146](https://github.com/rh-hideout/pokeemerald-expansion/pull/5146)
|
||||||
|
|
||||||
|
## ⚔️ Battle General ⚔️
|
||||||
|
### Changed
|
||||||
|
* Set new animation particles by default to off by @AlexOn1ine in [#5161](https://github.com/rh-hideout/pokeemerald-expansion/pull/5161)
|
||||||
|
### Fixed
|
||||||
|
* Fixed speed ties by @mrgriffin in [#4780](https://github.com/rh-hideout/pokeemerald-expansion/pull/4780)
|
||||||
|
* Cleanup by @hedara90 in [#5092](https://github.com/rh-hideout/pokeemerald-expansion/pull/5092)
|
||||||
|
* Fixed Defiant/Competitive not working after the battler enters the field with a Court Changed Sticky Web on its side of the field by @PhallenTree in [#5093](https://github.com/rh-hideout/pokeemerald-expansion/pull/5093)
|
||||||
|
* Fixed `trainerproc` not properly parsing line markers, which caused erroring lines to be offset by @mrgriffin in [#5122](https://github.com/rh-hideout/pokeemerald-expansion/pull/5122)
|
||||||
|
* Fixed initial Zigzagoon battle being able to use a Gimmick by @AlexOn1ine in [#5129](https://github.com/rh-hideout/pokeemerald-expansion/pull/5129)
|
||||||
|
* Fixed incorrect rounding when `maxHP` is lower than 16 by @hedara90 in [#5183](https://github.com/rh-hideout/pokeemerald-expansion/pull/5183)
|
||||||
|
* This caused these Pokémon to not be hurt by Sandstorm/Hail.
|
||||||
|
* Fixes UB in `Cmd_averagestats` by @mrgriffin and @AlexOn1ine in [#5191](https://github.com/rh-hideout/pokeemerald-expansion/pull/5191)
|
||||||
|
|
||||||
|
## 🤹 Moves 🤹
|
||||||
|
### Added
|
||||||
|
* Added move animations for multiple moves by @TheTrueSadfish in [#5159](https://github.com/rh-hideout/pokeemerald-expansion/pull/5159)
|
||||||
|
* Spin Out, Mortal Spin, Fillet Away, Flower Trick, Make It Rain, Shed Tail, Hyper Drill, Twin Beam, Comeuppance, Blood Moon, Fickle Beam, Thunder Clap, Hard Press, Dragon Cheer, Malignant Chain.
|
||||||
|
* Purple chains by ogwon on Discord, beam by @TheTrueSadfish and livra on Discord.
|
||||||
|
### Changed
|
||||||
|
* Adjusted Raging Bull's animation to include Brick Break's wall break effect by @TheTrueSadfish in [#5159](https://github.com/rh-hideout/pokeemerald-expansion/pull/5159)
|
||||||
|
### Fixed
|
||||||
|
* Fixed non-grass Ivy Cudgel breaking battle UI by @hedara90 in [#5117](https://github.com/rh-hideout/pokeemerald-expansion/pull/5117)
|
||||||
|
* Fixes Stomping Tantrum effect not doubling power in certain situations by @AlexOn1ine in [#5140](https://github.com/rh-hideout/pokeemerald-expansion/pull/5140)
|
||||||
|
* Fixed Fickle Beam's description by @PhallenTree in [#5093](https://github.com/rh-hideout/pokeemerald-expansion/pull/5093)
|
||||||
|
* Fixed Revelation Dance interactions with Z-Move, Roost and typeless mons by @PhallenTree in [#5133](https://github.com/rh-hideout/pokeemerald-expansion/pull/5133)
|
||||||
|
* Fixes Poltergeist missing its accuracy check by @AlexOn1ine in [#5168](https://github.com/rh-hideout/pokeemerald-expansion/pull/5168)
|
||||||
|
* Fixed Fickle Beam not showing its message by @TheTrueSadfish in [#5159](https://github.com/rh-hideout/pokeemerald-expansion/pull/5159)
|
||||||
|
* Fixed Retaliate not working correctly if the party member fainted via passive damage during end of turn by @hedara90 in [#5182](https://github.com/rh-hideout/pokeemerald-expansion/pull/5182)
|
||||||
|
* Fixed Flame Burst's passive damage being based off current HP rather than Max HP by @hedara90 in [#5182](https://github.com/rh-hideout/pokeemerald-expansion/pull/5182)
|
||||||
|
* Fixed using Population Bomb with Loaded Dice printing garbage text by @kittenchilly in [#5195](https://github.com/rh-hideout/pokeemerald-expansion/pull/5195)
|
||||||
|
|
||||||
|
## 🎭 Abilities 🎭
|
||||||
|
### Added
|
||||||
|
* Added in-battle effect of Pickup by @PhallenTree in [#5170](https://github.com/rh-hideout/pokeemerald-expansion/pull/5170)
|
||||||
|
### Fixed
|
||||||
|
* Fixes Purifying Salt not halving damage for dynamic move types by @AlexOn1ine in [#5145](https://github.com/rh-hideout/pokeemerald-expansion/pull/5145)
|
||||||
|
* Fixed Dancer-called moves not changing their type based on the new user by @PhallenTree in [#5133](https://github.com/rh-hideout/pokeemerald-expansion/pull/5133)
|
||||||
|
* Fixed Ice Face not regenerating after switching in during Hail/Snow by @hedara90 in [#5171](https://github.com/rh-hideout/pokeemerald-expansion/pull/5171)
|
||||||
|
* Fixed Wind Rider not activating when switched in while Tailwind is active on the user's side of the field activation and tests by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5207
|
||||||
|
|
||||||
|
## 🧶 Items 🧶
|
||||||
|
### Added
|
||||||
|
* Added Dowsing Machine's expanded name by @kittenchilly in [#5134](https://github.com/rh-hideout/pokeemerald-expansion/pull/5134)
|
||||||
|
### Fixed
|
||||||
|
* Fixes Booster Energy not increasing speed by @AlexOn1ine in [#5167](https://github.com/rh-hideout/pokeemerald-expansion/pull/5167)
|
||||||
|
|
||||||
|
## 🤖 Battle AI 🤖
|
||||||
|
### Changed
|
||||||
|
* Adjusted AI calculation for Triple Kick Effect by @AlexOn1ine in [#5127](https://github.com/rh-hideout/pokeemerald-expansion/pull/5127)
|
||||||
|
### Fixed
|
||||||
|
* Fix Switch AI Bug: AI never switching out when it could be OHKO'd by @Pawkkie in [#5089](https://github.com/rh-hideout/pokeemerald-expansion/pull/5089)
|
||||||
|
* Adds missing AI checks for poltergeist by @AlexOn1ine in [#5189](https://github.com/rh-hideout/pokeemerald-expansion/pull/5189)
|
||||||
|
|
||||||
|
## 🧹 Other Cleanup 🧹
|
||||||
|
* `IsValidForBattle` function formatting by @AlexOn1ine in [#5085](https://github.com/rh-hideout/pokeemerald-expansion/pull/5085)
|
||||||
|
* Opportunist/Mirror Herb cleanup by @AlexOn1ine in [#5120](https://github.com/rh-hideout/pokeemerald-expansion/pull/5120)
|
||||||
|
* Cleanup by @AlexOn1ine in [#5158](https://github.com/rh-hideout/pokeemerald-expansion/pull/5158)
|
||||||
|
* Remove trailing whitespace (master) by @AsparagusEduardo in [#5174](https://github.com/rh-hideout/pokeemerald-expansion/pull/5174)
|
||||||
|
|
||||||
|
## 🧪 Test Runner 🧪
|
||||||
|
### Added
|
||||||
|
* Added missing Move Effect TODO tests - Volume C by @AsparagusEduardo in [#5094](https://github.com/rh-hideout/pokeemerald-expansion/pull/5094)
|
||||||
|
* Added multiple missing ability TODO tests by @AsparagusEduardo in [#5163](https://github.com/rh-hideout/pokeemerald-expansion/pull/5163)
|
||||||
|
* Added missing Guard/Power split tests by @mrgriffin and @AlexOn1ine in [#5191](https://github.com/rh-hideout/pokeemerald-expansion/pull/5191)
|
||||||
|
* Added missing Harvest and Pickup tests by @PhallenTree in [#5170](https://github.com/rh-hideout/pokeemerald-expansion/pull/5170)
|
||||||
|
* Added missing Round tests by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5196
|
||||||
|
* Added missing Wind Rider tests by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5207
|
||||||
|
### Changed
|
||||||
|
* Fixed G-Max Replenish not considering Gen 5+ Pickup by @PhallenTree in [#5170](https://github.com/rh-hideout/pokeemerald-expansion/pull/5170)
|
||||||
|
### Fixed
|
||||||
|
* Fixed `RandomUniformExcept` not being exclusive on the higher boundary by @PhallenTree in [#5170](https://github.com/rh-hideout/pokeemerald-expansion/pull/5170)
|
||||||
|
|
||||||
|
|
||||||
|
## 📚 Documentation 📚
|
||||||
|
* Added guide to running documentation website locally by @AsparagusEduardo in [#5059](https://github.com/rh-hideout/pokeemerald-expansion/pull/5059)
|
||||||
|
* How to docs and fixes to be added to the mdbook documentation site by @anrichtait in [#5070](https://github.com/rh-hideout/pokeemerald-expansion/pull/5070)
|
||||||
|
* Improved 1.8 ⇒ 1.9 non-Competitive syntax migration instructions by @mrgriffin in [#5079](https://github.com/rh-hideout/pokeemerald-expansion/pull/5079)
|
||||||
|
|
||||||
|
## 📦 Branch Synchronisation 📦
|
||||||
|
### pret
|
||||||
|
* 5th of August in [#5098](https://github.com/rh-hideout/pokeemerald-expansion/pull/5098)
|
||||||
|
* Fixed bottom half of Mt. Pyre not being labeled in PokeNav by @fdeblasio in [pret#2018](https://github.com/pret/pokeemerald/pull/2018)
|
||||||
|
* 7th of August in [#5116](https://github.com/rh-hideout/pokeemerald-expansion/pull/5116)
|
||||||
|
* Changed type1 and type2 to be consistent by @pkmnsnfrn in [pret#2021](https://github.com/pret/pokeemerald/pull/2021)
|
||||||
|
* 14th of August in [#5165](https://github.com/rh-hideout/pokeemerald-expansion/pull/5165)
|
||||||
|
* Fix type for offset in MapConnection by @GriffinRichards in [pret#2011](https://github.com/pret/pokeemerald/pull/2011)
|
||||||
|
### Followers
|
||||||
|
* 7th of August in [#5110](https://github.com/rh-hideout/pokeemerald-expansion/pull/5110)
|
||||||
|
* Fixed expanded OW IDs by @pkmnsnfrn in [aarant#38](https://github.com/aarant/pokeemerald/pull/38)
|
||||||
|
* Fix two small text errors in follower dialogue by @Bassoonian in [aarant#39](https://github.com/aarant/pokeemerald/pull/39)
|
||||||
|
|
||||||
|
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.0...expansion/1.9.1
|
||||||
|
|
||||||
|
## New Contributors
|
||||||
|
* @TheTrueSadfish made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/5159
|
||||||
|
|
||||||
|
<!--Last PR: 5196-->
|
||||||
@ -6,7 +6,8 @@
|
|||||||
- Once you have your remote set up, run the command `git pull RHH expansion/1.Y.Z`.
|
- Once you have your remote set up, run the command `git pull RHH expansion/1.Y.Z`.
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🌋 *IMPORTANT CHANGES AND REFACTORS* 🌋
|
## 🌋 *REFACTORS* 🌋
|
||||||
|
📜 = Uses a migration script.
|
||||||
* N/A
|
* N/A
|
||||||
|
|
||||||
## 💥 *Softlock/Crash fixes* 💥
|
## 💥 *Softlock/Crash fixes* 💥
|
||||||
@ -49,6 +50,13 @@
|
|||||||
* N/A
|
* N/A
|
||||||
#### Fixed
|
#### Fixed
|
||||||
* N/A
|
* N/A
|
||||||
|
### ***merrp/aarant's Followers***
|
||||||
|
#### Added
|
||||||
|
* N/A
|
||||||
|
#### Changed
|
||||||
|
* N/A
|
||||||
|
#### Fixed
|
||||||
|
* N/A
|
||||||
|
|
||||||
## 🐉 Pokémon 🐉
|
## 🐉 Pokémon 🐉
|
||||||
### Added
|
### Added
|
||||||
@ -114,7 +122,10 @@
|
|||||||
### Fixed
|
### Fixed
|
||||||
* N/A
|
* N/A
|
||||||
|
|
||||||
## 📦 Pret merges 📦
|
## 📦 Branch Synchronisation 📦
|
||||||
|
### pret's base pokeemerald
|
||||||
|
* N/A
|
||||||
|
### merrp/aarant's followers
|
||||||
* N/A
|
* N/A
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
51
docs/how_to_battle_script_command_macro.md
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
## How to add new Battle Script Commands/Macros
|
||||||
|
|
||||||
|
To preface this tutorial, the battle engine upgrade has exhausted all battle script command IDs, and instead uses the `various` command to effectively add new commands. This is preferential to creating a secondary battle script command table like is done in the CFRU.
|
||||||
|
|
||||||
|
In general, `gBattlescriptCurrInstr` tracks the current battle script position as a ROM address. Fortunately, we don't need to worry about ROM addresses when using the decomps, but it is important to understand because of how the `various` command is set up.
|
||||||
|
|
||||||
|
```
|
||||||
|
.macro various battler:req, param1:req
|
||||||
|
.byte 0x76
|
||||||
|
.byte \battler
|
||||||
|
.byte \param1
|
||||||
|
.endm
|
||||||
|
```
|
||||||
|
|
||||||
|
`various` is 3 bytes in size, so if we wanted to advance to the next battle script command, we would write `gBattlescriptCurrInstr += 3`. Coincidentally, this is found at the end of `Cmd_Various` in `src/battle_script_commands.c`.
|
||||||
|
|
||||||
|
Now, how might we add a custom various command case? Here are the steps. We will use `VARIOUS_SET_SIMPLE_BEAM` as an example.
|
||||||
|
### 1. Add a definition to `include/constants/battle_script_commands.h`.
|
||||||
|
|
||||||
|
For example, `#define VARIOUS_SET_SIMPLE_BEAM 39`
|
||||||
|
|
||||||
|
### 2. Create a macro in `asm/macros/battle_script.inc`. For example:
|
||||||
|
```c
|
||||||
|
.macro setabilitysimple battler:req, ptr:req
|
||||||
|
various \battler VARIOUS_SET_SIMPLE_BEAM
|
||||||
|
.4byte \ptr
|
||||||
|
.endm
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Add your new various command ID to `Cmd_Various`. For example:
|
||||||
|
```c
|
||||||
|
case VARIOUS_SET_SIMPLE_BEAM:
|
||||||
|
if (IsEntrainmentTargetOrSimpleBeamBannedAbility(gBattleMons[gBattlerTarget].ability)
|
||||||
|
|| gBattleMons[gBattlerTarget].ability == ABILITY_SIMPLE)
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattleMons[gBattlerTarget].ability = ABILITY_SIMPLE;
|
||||||
|
RecordAbilityBattle(gActiveBattler, ABILITY_SIMPLE);
|
||||||
|
gBattlescriptCurrInstr += 7;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
```
|
||||||
|
|
||||||
|
The macros' `battler` argument is the battler who will be affected/considered by your command. In our case, which battler we will try to give `ABILITY_SIMPLE`. Note that `gActiveBattler` is always set to this battler at the beginning of `Cmd_Various`.
|
||||||
|
|
||||||
|
The `ptr` argument is an extra argument that, in this case, provides a battle script to jump to in the event that we fail to set `ABILITY_SIMPLE`. We must add the `.4byte \ptr` inside our macro. So now when we want to advance to the next battle script command in our script, we must increment `gBattlescriptCurrInstr` by `7` because our overall macro is 3 bytes for the various command, and 4 bytes for the pointer. *IMPORTANT* the `return` at the end of the switch case is required because remember that `various` always defaults to `gBattlescriptCurrInstr += 3` at the very end of the function, so if we included `gBattlescriptCurrInstr += 7` with a `break`, we would end up effectively doing `gBattlescriptCurrInstr += 10`.
|
||||||
|
|
||||||
|
This behavior can be found under the `else` statement in the example above, corresponding to `ABILITY_SIMPLE` being correctly applied. If we are unable to set `ABILITY_SIMPLE`, however, notice the following `gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);`. This means we are jumping to the battle script provided by the pointer 3 bytes after our various command (which is the `ptr` argument described previously). We still must `return` or else we would actually jump to 3 bytes after the `ptr` battle script begins.
|
||||||
197
docs/how_to_new_move.md
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
*Full credits and thank you to CancerFairy for writing this guide!*
|
||||||
|
|
||||||
|
### Note: This guide was written for version 1.8.0. Most stuff still applies to 1.7.x versions and earlier, with the following exceptions:
|
||||||
|
- Battle and Contest move data are separated in `src/data/battle_moves.h` and `src/data/contest_moves.h`
|
||||||
|
- `additionalEffects` doesn't exist, instead being handled by a combination of `secondaryEffectChance` and unique `EFFECT_xxx`s.
|
||||||
|
- There's no `include/constants/battle_move_effects.h`, so data specific to certain effects is handled in other places.
|
||||||
|
- Move names are handled in `gMoveNames`.
|
||||||
|
|
||||||
|
# Adding/editing moves
|
||||||
|
This guide is here to give you a breakdown of how moves work, how to edit existing ones, and how to add your own.
|
||||||
|
|
||||||
|
## Contents:
|
||||||
|
1. [Key files and definitions](#key-files-and-definitions)
|
||||||
|
- [Header files](#header-files)
|
||||||
|
- [C files](#c-files)
|
||||||
|
- [Script files](#script-files)
|
||||||
|
2. [Editing a move](#editing-a-move)
|
||||||
|
3. [Adding a new move](#adding-a-new-move)
|
||||||
|
|
||||||
|
## Key files and definitions
|
||||||
|
Before beginning the process, it's important to familiarise yourself with the important files that control moves. There are three categories of files - header(.h) files, which contain static information about a move, .c files which contains functions in C that determine how the move behaves, and script files (.s or .inc) that actually "run" the move - i.e. determine the sequence of events you see on screen when you execute the move.
|
||||||
|
|
||||||
|
## Header files
|
||||||
|
### src/data/moves_info.h
|
||||||
|
This is the place where the bulk of move information is stored, including name, base power, typing, PP, contest information etc.
|
||||||
|
|
||||||
|
Let's look at an example:
|
||||||
|
```c
|
||||||
|
[MOVE_THUNDER_SHOCK] =
|
||||||
|
{
|
||||||
|
.name = HANDLE_EXPANDED_MOVE_NAME("ThunderShock", "Thunder Shock"),
|
||||||
|
.description = COMPOUND_STRING(
|
||||||
|
"An electrical attack that\n"
|
||||||
|
"may paralyze the foe."),
|
||||||
|
.effect = EFFECT_HIT,
|
||||||
|
.power = 40,
|
||||||
|
.type = TYPE_ELECTRIC,
|
||||||
|
.accuracy = 100,
|
||||||
|
.pp = 30,
|
||||||
|
.target = MOVE_TARGET_SELECTED,
|
||||||
|
.priority = 0,
|
||||||
|
.category = DAMAGE_CATEGORY_SPECIAL,
|
||||||
|
.sheerForceBoost = TRUE,
|
||||||
|
.additionalEffects = ADDITIONAL_EFFECTS({
|
||||||
|
.moveEffect = MOVE_EFFECT_PARALYSIS,
|
||||||
|
.chance = 10,
|
||||||
|
}),
|
||||||
|
.contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING,
|
||||||
|
.contestCategory = CONTEST_CATEGORY_COOL,
|
||||||
|
.contestComboStarterId = 0,
|
||||||
|
.contestComboMoves = {COMBO_STARTER_CHARGE},
|
||||||
|
},
|
||||||
|
```
|
||||||
|
The `HANDLE_EXPANDED_MOVE_NAME` allows the usage of a name of extended character length, so long as the `B_EXPANDED_MOVE_NAMES` is set to `TRUE`, whereas by default it's limited in Gen 3 to 12 characters. Most of the fields here are obvious, but the two important ones for determining what a move actually *does* are `effect` and `additionalEffects`.
|
||||||
|
|
||||||
|
The `effect` represents how the move actually works when called in battle - it can be a two turn move, or a move that only works if the target is holding an item, for example. How each effect works is pretty much unique, but the way a move of a particular effect is executed is defined by a script [`data/battle_scripts_1.s`](#databattle_scripts_1s), and any *variable* characteristics such as typing or power are defined in either [`src/battle_script_commands.c`](#srcbattle_script_commandsc) or [`src/battle_util.c`](#srcbattle_utilc), depending on the effect. The vast majority of non-status moves are simply `EFFECT_HIT`, in that they deal damage and apply `additionalEffects` (if defined).
|
||||||
|
|
||||||
|
The `additionalEffects` field represents effects that are applied at the `setadditionaleffects` stage of the move script (for most moves, see `BattleScript_Hit_RetFromAtkAnimation`). These are effects that can be encapsulated by any of the `MOVE_EFFECT_X` defined in [`include/constants/battle.h`](#includeconstantsbattleh) and encoded under `SetMoveEffect` in [`src/battle_script_commands.c`](#srcbattle_script_commandsc). These can vary from applying a status, such as `MOVE_EFFECT_PARALYSIS`, or lowering/raising stats etc. The move effect could target the user by setting `self = TRUE`, such as Overheat lowering the user's own Sp. Atk. What's more, definining a `chance`, such as for Thunder Shock, not only limits the effect to applying only `chance`% of the time, but it also turns it into a *secondary effect.* This difference is important because secondary effects are nullified by Sheer Force (which in turn will boost the move's power) and they are blocked by Shield Dust. These two limitations do not apply to *primary effects* which do not a chance field defined and by definition will *always* happen when the move is executed.
|
||||||
|
|
||||||
|
### src/data/battle_move_effects.h
|
||||||
|
Effects are listed here along with the `battleScript` that governs each one. Said scripts are defined in [`data/battle_scripts_1.s`](#databattle_scripts_1s). The indices/names of the effects (e.g. `EFFECT_FIRST_TURN_ONLY`) are enums defined in [`include/constants/battle_move_effects.h`](#includeconstantsbattle_move_effectsh).
|
||||||
|
|
||||||
|
### include/battle_scripts.h
|
||||||
|
Contains references to scripts [`data/battle_scripts_1.s`](#databattle_scripts_1s), allowing them to be referenced in C. Any new scripts must be added here.
|
||||||
|
|
||||||
|
### include/constants/battle_move_effects.h
|
||||||
|
Simply an enum list of possible effects for moves. Any new effects would be added here, with a definition for them (including defining a script) would then also be added to [`src/data/battle_move_effects.h`](#srcdatabattle_move_effectsh).
|
||||||
|
|
||||||
|
### include/constants/battle_string_ids.h
|
||||||
|
All strings that can be printed in battle have an id that is defined here. The actual message itself would then be defined and assigned to this id in [`src/data/battle_message.c`](#srcbattle_messagec).
|
||||||
|
|
||||||
|
### include/constants/battle.h
|
||||||
|
A whole range of constants defining battle variables, such as statuses, weather, and move effects.
|
||||||
|
|
||||||
|
### include/constants/moves.h
|
||||||
|
Where moves are defined (and nothing else).
|
||||||
|
|
||||||
|
**Note:** When adding custom moves, you should add them between the moves from the latest generation and the z moves, then adjust `MOVES_COUNT` accordingly. Adding a move after `MOVES_COUNT` that is neither a Max Move or a Z Move will result in that move's name not being printed when it is used, instead a generic message will be printed.
|
||||||
|
|
||||||
|
## C files
|
||||||
|
### src/battle_script_commands.c
|
||||||
|
This is where a lot of the commands referred to in scripts are defined. For example, the `jumpifnotfirstturn` command above is defined by the function `Cmd_jumpifnotfirstturn` and you can see how it works in C. It's possible that any move editing or updating you have in mind can be done with existing commands, but if you wanted to add a new function that could be called in a script above, this is where you would define it.
|
||||||
|
|
||||||
|
### src/battle_util.c
|
||||||
|
This contains a lot of the "utility" functions used to determine things like a move's dynamic typing or power. It's also where damage calculation takes place, and a lot of that will naturally take a move's effect into account. For example, a move with the effect `EFFECT_SOLAR_BEAM` would have its damage halved in sandstorm. If you wanted to add a move with an effect which gave it variable BP or typing, this is the file you would encode that effect.
|
||||||
|
|
||||||
|
### src/battle_message.c
|
||||||
|
Contains string defines and functions that print messages during the battle. If you wish to add or edit a move's string, then this is where you would do so.
|
||||||
|
|
||||||
|
### src/battle_main.c
|
||||||
|
Contains more fundamental functions that control the flow of the battle. Functions here determine move order, dynamic typing, animations, priority, speed calculations and more.
|
||||||
|
|
||||||
|
## Script files
|
||||||
|
### data/battle_scripts_1.s
|
||||||
|
Each move's effect is governed by a script defined here. For a simple example, let's look at the script for Fake Out/First Impression:
|
||||||
|
|
||||||
|
```
|
||||||
|
BattleScript_EffectFirstTurnOnly::
|
||||||
|
attackcanceler
|
||||||
|
jumpifnotfirstturn BattleScript_FailedFromAtkString
|
||||||
|
goto BattleScript_EffectHit
|
||||||
|
```
|
||||||
|
|
||||||
|
`attackcanceler` is a command that covers all the cases that could cause a move to fail before it's even attempted (e.g. paralysis). And as we can tell from the commands, if it's not the first turn, we go to `BattleScript_FailedFromAtkString` which evidently causes us to print the `attackstring` ("POKEMON used MOVE") then fail ("But it failed!"). Otherwise, we go to the generic "hit" effect which is the same script for moves that just deal damage and nothing else.
|
||||||
|
|
||||||
|
This is the most advanced part of the ROM. There are dozens upon dozens of commands and hundreds of scripts so this guide would go on forever if I were to go into more detail. To learn how these scripts work, it's best to look at a few examples of moves you know.
|
||||||
|
|
||||||
|
### asm/macros/battle_script.inc
|
||||||
|
The "link" between [`data/battle_scripts_1.s`](#databattle_scripts_1s) and [`src/battle_script_commands.c`](#srcbattle_script_commandsc). Each command is represented by a hex byte which represents its index in the `gBattleScriptingCommandsTable` array at the top of [`src/battle_script_commands.c`](#srcbattle_script_commandsc). However, this file also contains macros which perform combinations of other commands, or just calculations in assembly. In addition to commands, it is also possible to call functions in [`src/battle_script_commands.c`](#srcbattle_script_commandsc) using the `various` (now gradually being deprecated) and the `callnative` functionality. The `various` macros will point to a case under the `Cmd_various` function in [`src/battle_script_commands.c`](#srcbattle_script_commandsc), whereas `callnative` will let you directly call a function in [`src/battle_script_commands.c`](#srcbattle_script_commandsc) by name.
|
||||||
|
|
||||||
|
### data/battle_anim_scripts.s
|
||||||
|
This is the place where move animations are defined. The array at the top, `gBattleAnims_Moves`, is in move index order and determines which animation goes with which move.
|
||||||
|
|
||||||
|
## Editing a move
|
||||||
|
### Basic information
|
||||||
|
To edit a move's basic information, you need only edit the relevant fields in [`src/data/battle_moves.h`](#srcdatamoves_infoh). This will let you change a move's:
|
||||||
|
- name
|
||||||
|
- description
|
||||||
|
- power
|
||||||
|
- accuracy
|
||||||
|
- type
|
||||||
|
- category
|
||||||
|
- target
|
||||||
|
- pp
|
||||||
|
- recoil percentage
|
||||||
|
- flags
|
||||||
|
- Z-move effect (for status moves) or overwritting its calculated power (for damaging moves)
|
||||||
|
|
||||||
|
### Changing a move's main effect
|
||||||
|
To change the main effect of a move to an existing effect, you need only change its `effect` field to one of the options in [`src/data/battle_move_effects.h`](#srcdatabattle_move_effectsh). If you wish to keep the effect but simply modify how it works, you can modify how it plays out on screen by editing its entry in [`data/battle_scripts_1.s`](#databattle_scripts_1s) and any relevant functions in [`src/battle_script_commands.c`](#srcbattle_script_commandsc). To change how a move's dynamic power, accuracy and are calculated, then you need to modify the following functions:
|
||||||
|
|
||||||
|
- For power: `CalcMoveBasePowerAfterModifiers` in [`src/battle_util.c`](#srcbattle_utilc)
|
||||||
|
- For accuracy: `AccuracyCalcHelper` in [`src/battle_script_commands.c`](#srcbattle_script_commandsc)
|
||||||
|
- For type: `SetTypeBeforeUsingMove` in [`src/battle_main.c`](#srcbattle_mainc)
|
||||||
|
|
||||||
|
Note: A generic function for calculating category does not currently exist - Photon Geyser's script in [`data/battle_scripts_1.s`](#databattle_scripts_1s) uses a special `callnative` function `BS_SetPhotonGeyserCategory`.
|
||||||
|
|
||||||
|
### Changing a move's additional effects
|
||||||
|
If you look at the example [here](#srcdatamoves_infoh), you can see that Thunder Shock has an additional effects array that contains a single move effect `MOVE_EFFECT_PARALYSIS` with a 10% chance of applying. Thanks to this field, you can add and remove primary and secondary effects (so long as they are defined by a `MOVE_EFFECT`) to a move without having to change its effect or script. You can also make an effect apply to the attacker rather than the target (for, say, a stat boost) with `.self = TRUE` and you can set the probability to whatever you want with the `chance` field.
|
||||||
|
|
||||||
|
All additional effects with a defined chance (even 100%) are treated as "secondary effects". This means that they are nullified by Sheer Force, blocked by Shield Dust or the Covert Cloak, and have their chance modified by Serene Grace. Additional effects without a chance field (effectively setting it to 0) are treated as "primary effects", which means that they cannot be blocked by the aforementioned items and abilities and their chance to occur cannot be modified; they will *always* happen.
|
||||||
|
|
||||||
|
Each move can have up to 15 additional effects, allowing you to construct monstrosities like this:
|
||||||
|
```
|
||||||
|
[MOVE_POUND] =
|
||||||
|
{
|
||||||
|
.name = COMPOUND_STRING("Pound"),
|
||||||
|
.description = COMPOUND_STRING(
|
||||||
|
"Pounds the foe with\n"
|
||||||
|
"forelegs or tail."),
|
||||||
|
.effect = EFFECT_HIT,
|
||||||
|
.power = 40,
|
||||||
|
.type = TYPE_NORMAL,
|
||||||
|
.accuracy = 100,
|
||||||
|
.pp = 35,
|
||||||
|
.target = MOVE_TARGET_SELECTED,
|
||||||
|
.priority = 0,
|
||||||
|
.category = DAMAGE_CATEGORY_PHYSICAL,
|
||||||
|
.additionalEffects = ADDITIONAL_EFFECTS({
|
||||||
|
.moveEffect = MOVE_EFFECT_PARALYSIS,
|
||||||
|
.chance = 10,
|
||||||
|
},{
|
||||||
|
.moveEffect = MOVE_EFFECT_CONFUSION,
|
||||||
|
.chance = 100,
|
||||||
|
},{
|
||||||
|
.moveEffect = MOVE_EFFECT_FLINCH,
|
||||||
|
.chance = 30,
|
||||||
|
},{
|
||||||
|
.moveEffect = MOVE_EFFECT_ALL_STATS_UP,
|
||||||
|
.chance = 40,
|
||||||
|
.self = TRUE,
|
||||||
|
},{
|
||||||
|
.moveEffect = MOVE_EFFECT_RAPID_SPIN,
|
||||||
|
},{
|
||||||
|
.moveEffect = MOVE_EFFECT_DEF_MINUS_2,
|
||||||
|
.chance = 50,
|
||||||
|
}),
|
||||||
|
.makesContact = TRUE,
|
||||||
|
.ignoresKingsRock = B_UPDATED_MOVE_FLAGS == GEN_4,
|
||||||
|
.contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING,
|
||||||
|
.contestCategory = CONTEST_CATEGORY_TOUGH,
|
||||||
|
.contestComboStarterId = COMBO_STARTER_POUND,
|
||||||
|
.contestComboMoves = {0}
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note: at the moment, additional effects can only be used by damaging moves, not by status moves.**
|
||||||
|
|
||||||
|
## Adding a new move
|
||||||
|
To add a new move, you need to create an entry in three locations:
|
||||||
|
|
||||||
|
- a define in [`include/constants/moves.h`](#includeconstantsmovesh)
|
||||||
|
- an info entry in [`src/data/battle_moves.h`](#srcdatamoves_infoh)
|
||||||
|
- an animation entry in [data/battle_anim_scripts.s](#databattle_anim_scriptss)
|
||||||
|
|
||||||
|
And that's it! You can use an existing animation or effect for your move - or you can add your own, but I'll leave figuring that out to you.
|
||||||
|
|
||||||
1860
docs/how_to_new_pokemon_1_6_0.md
Normal file
1049
docs/how_to_new_pokemon_1_7_0.md
Normal file
1049
docs/how_to_new_pokemon_1_8_0.md
Normal file
1139
docs/how_to_new_pokemon_1_9_0.md
Normal file
578
docs/how_to_testing_system.md
Normal file
@ -0,0 +1,578 @@
|
|||||||
|
# How to use the Testing System
|
||||||
|
|
||||||
|
## Running Tests
|
||||||
|
To run all the tests use:
|
||||||
|
`make check -j`
|
||||||
|
To run specific tests, e.g. Spikes ones, use:
|
||||||
|
`make check TESTS='Spikes'`
|
||||||
|
To build a ROM (pokemerald-test.elf) that can be opened in mgba to view specific tests, e.g. Spikes ones, use:
|
||||||
|
`make pokeemerald-test.elf TESTS='Spikes'`
|
||||||
|
|
||||||
|
## How to Write Tests
|
||||||
|
Manually testing a battle mechanic often follows this pattern:
|
||||||
|
1. Create a party which can activate the mechanic.
|
||||||
|
2. Start a battle and play a few turns which activate the mechanic.
|
||||||
|
3. Look at the UI outputs to decide if the mechanic works.
|
||||||
|
|
||||||
|
Automated testing follows the same pattern:
|
||||||
|
1. Initialize the party in `GIVEN`.
|
||||||
|
2. Play the turns in `WHEN`.
|
||||||
|
3. Check the UI outputs in `SCENE`.
|
||||||
|
|
||||||
|
### Example 1
|
||||||
|
As a concrete example, to manually test `EFFECT_PARALYZE`, e.g. the
|
||||||
|
effect of Stun Spore you might:
|
||||||
|
1. Put a Wobbuffet that knows Stun Spore in your party.
|
||||||
|
2. Battle a wild Wobbuffet.
|
||||||
|
3. Use Stun Spore.
|
||||||
|
4. Check that the Wobbuffet is paralyzed.
|
||||||
|
|
||||||
|
This can be translated to an automated test as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
ASSUMPTIONS
|
||||||
|
{
|
||||||
|
ASSUME(gMovesInfo[MOVE_STUN_SPORE].effect == EFFECT_PARALYZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
SINGLE_BATTLE_TEST("Stun Spore inflicts paralysis")
|
||||||
|
{
|
||||||
|
GIVEN {
|
||||||
|
PLAYER(SPECIES_WOBBUFFET); // 1.
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET); // 2.
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_STUN_SPORE); } // 3.
|
||||||
|
} SCENE {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player);
|
||||||
|
MESSAGE("Foe Wobbuffet is paralyzed! It may be unable to move!"); // 4
|
||||||
|
STATUS_ICON(opponent, paralysis: TRUE); // 4.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `ASSUMPTIONS` block documents that Stun Spore has `EFFECT_PARALYZE`.
|
||||||
|
If Stun Spore did not have that effect it would cause the tests in the file to be skipped. We write our tests like this so that hackers can change the effects of moves without causing tests to fail.
|
||||||
|
|
||||||
|
`SINGLE_BATTLE_TEST` defines the name of the test. Related tests should start with the same prefix, e.g. Stun Spore tests should start with "Stun Spore", this allows just the Stun Spore-related tests to be run with:
|
||||||
|
`make check TESTS='Stun Spore'`
|
||||||
|
|
||||||
|
`GIVEN` initializes the parties, `PLAYER` and `OPPONENT` add a Pokémon to their respective parties. They can both accept a block which further customizes the Pokémon's stats, moves, item, ability, etc.
|
||||||
|
|
||||||
|
`WHEN` describes the turns, and `TURN` describes the choices made in a single turn. `MOVE` causes the player to use Stun Spore and adds the move to the Pokémon's moveset if an explicit Moves was not specified.
|
||||||
|
Pokémon that are not mentioned in a `TURN` use Celebrate.
|
||||||
|
The test runner rigs the RNG so that unless otherwise specified, moves always hit, never critical hit, always activate their secondary effects, and always roll the same damage modifier.
|
||||||
|
|
||||||
|
`SCENE` describes the player-visible output of the battle. In this case `ANIMATION` checks that the Stun Spore animation played, `MESSAGE` checks the paralysis message was shown, and `STATUS_ICON` checks that the opponent's HP bar shows a PRZ icon.
|
||||||
|
|
||||||
|
### Example 2
|
||||||
|
As a second example, to manually test that Stun Spore does not effect Grass-types you might:
|
||||||
|
1. Put a Wobbuffet that knows Stun Spore in your party.
|
||||||
|
2. Battle a wild Oddish.
|
||||||
|
3. Use Stun Spore.
|
||||||
|
4. Check that the move animation does not play.
|
||||||
|
5. Check that a "It doesn't affect Foe Oddish…" message is shown.
|
||||||
|
|
||||||
|
This can again be translated as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
SINGLE_BATTLE_TEST("Stun Spore does not affect Grass-types")
|
||||||
|
{
|
||||||
|
GIVEN {
|
||||||
|
ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove);
|
||||||
|
ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS);
|
||||||
|
PLAYER(SPECIES_ODDISH); // 1.
|
||||||
|
OPPONENT(SPECIES_ODDISH); // 2.
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_STUN_SPORE); } // 3.
|
||||||
|
} SCENE {
|
||||||
|
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player); // 4.
|
||||||
|
MESSAGE("It doesn't affect Foe Oddish…"); // 5.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
The `ASSUME` commands are documenting the reasons why Stun Spore does not affect Oddish, namely that Stun Spore is a powder move, and Oddish is a Grass-type. These `ASSUME` statements function similarly to the ones in `ASSUMPTIONS` but apply only to the one test.
|
||||||
|
NOT inverts the meaning of a `SCENE` check, so applying it to `ANIMATION` requires that the Stun Spore animation does not play. `MESSAGE` checks that the message was shown.
|
||||||
|
The checks in `SCENE` are ordered, so together this says "The doesn't affect message is shown, and the Stun Spore animation does not play at any time before that". Normally you would only test one or the other, or even better, just `NOT STATUS_ICON(opponent, paralysis: TRUE);` to say that Oddish was not paralyzed without specifying the exact outputs which led to that.
|
||||||
|
|
||||||
|
### Example 3
|
||||||
|
As a final example, to test that Meditate works you might:
|
||||||
|
1. Put a Wobbuffet that knows Meditate and Tackle in your party.
|
||||||
|
2. Battle a wild Wobbuffet.
|
||||||
|
3. Use Tackle and note the amount the HP bar reduced.
|
||||||
|
4. Battle a wild Wobbuffet.
|
||||||
|
5. Use Meditate and that the stat change animation and message play.
|
||||||
|
6. Use Tackle and check that the HP bar reduced by more than in 3.
|
||||||
|
|
||||||
|
This can be translated to an automated test as follows:
|
||||||
|
```
|
||||||
|
SINGLE_BATTLE_TEST("Meditate raises Attack", s16 damage)
|
||||||
|
{
|
||||||
|
bool32 raiseAttack;
|
||||||
|
PARAMETRIZE { raiseAttack = FALSE; }
|
||||||
|
PARAMETRIZE { raiseAttack = TRUE; }
|
||||||
|
GIVEN {
|
||||||
|
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||||
|
PLAYER(SPECIES_WOBBUFFET);
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
if (raiseAttack) TURN { MOVE(player, MOVE_MEDITATE); } // 5.
|
||||||
|
TURN { MOVE(player, MOVE_TACKLE); } // 3 & 6.
|
||||||
|
} SCENE {
|
||||||
|
if (raiseAttack) {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_MEDITATE, player);
|
||||||
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); // 5.
|
||||||
|
MESSAGE("Wobbuffet's attack rose!"); // 5.
|
||||||
|
}
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player);
|
||||||
|
HP_BAR(opponent, captureDamage: &results[i].damage); // 3 & 6.
|
||||||
|
} FINALLY {
|
||||||
|
EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); // 6.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`PARAMETRIZE` causes a test to run multiple times, once per `PARAMETRIZE` block (e.g. once with `raiseAttack = FALSE` and once with `raiseAttack = TRUE`).
|
||||||
|
The `HP_BAR` command's `captureDamage` causes the change in HP to be stored in a variable, and the variable chosen is `results[i].damage`.
|
||||||
|
`results[i]` contains all the variables defined at the end of `SINGLE_BATTLE_TEST`, `i` is the current `PARAMETRIZE` index.
|
||||||
|
`FINALLY` runs after the last parameter has finished, and uses `EXPECT_MUL_EQ` to check that the second battle deals 1.5× the damage of the first battle (with a small tolerance to account for rounding).
|
||||||
|
|
||||||
|
You might notice that all the tests check the outputs the player could see rather than the internal battle state. e.g. the Meditate test could have used `gBattleMons[B_POSITION_OPPONENT_LEFT].hp` instead of using `HP_BAR` to capture the damage. This is a deliberate choice, by checking what the player can observe the tests are more robust to refactoring, e.g. if `gBattleMons` got moved into `gBattleStruct` then any test that used it would need to be updated.
|
||||||
|
|
||||||
|
### Note on Overworld Tests
|
||||||
|
The overworld is not available, so it is only possible to test commands which don't affect the overworld itself, e.g. `givemon` can be tested because it only alters `gPlayerParty`, but `addobject` cannot because it affects object events (which aren't loaded).
|
||||||
|
|
||||||
|
## REFERENCE
|
||||||
|
|
||||||
|
### `ASSUME`
|
||||||
|
`ASSUME(cond)`
|
||||||
|
Causes the test to be skipped if `cond` is false. Used to document any prerequisites of the test, e.g. to test Burn reducing the Attack of a Pokémon we can observe the damage of a physical attack with and without the burn. To document that this test assumes the attack is physical we can use:
|
||||||
|
`ASSUME(gMovesInfo[MOVE_WHATEVER].category == DAMAGE_CATEGORY_PHYSICAL);`
|
||||||
|
|
||||||
|
### `ASSUMPTIONS`
|
||||||
|
```
|
||||||
|
ASSUMPTIONS
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Should be placed immediately after any `#includes` and contain any `ASSUME` statements which should apply to the whole file, e.g. to test `EFFECT_POISON_HIT` we need to choose a move with that effect, if we chose to use Poison Sting in every test then the top of `move_effect_poison_hit.c` should be:
|
||||||
|
```
|
||||||
|
ASSUMPTIONS
|
||||||
|
{
|
||||||
|
ASSUME(gMovesInfo[MOVE_POISON_STING].effect == EFFECT_POISON_HIT);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `SINGLE_BATTLE_TEST`
|
||||||
|
`SINGLE_BATTLE_TEST(name, results...)` and `DOUBLE_BATTLE_TEST(name, results...)`
|
||||||
|
Define single- and double- battles. The names should start with the name of the mechanic being tested so that it is easier to run all the related tests. `results` contains variable declarations to be placed into the `results` array which is available in tests using `PARAMETRIZE` commands.
|
||||||
|
The main differences for doubles are:
|
||||||
|
- Move targets sometimes need to be explicit.
|
||||||
|
- Instead of `player` and `opponent` there is `playerLeft`, `playerRight`, `opponentLeft`, and `opponentRight`.
|
||||||
|
|
||||||
|
### `AI_SINGLE_BATTLE_TEST`
|
||||||
|
`AI_SINGLE_BATTLE_TEST(name, results...)` and `AI_DOUBLE_BATTLE_TEST(name, results...)`
|
||||||
|
Define battles where opponent mons are controlled by AI, the same that runs
|
||||||
|
when battling regular Trainers. The flags for AI should be specified by the `AI_FLAGS` command.
|
||||||
|
The rules remain the same as with the `SINGLE` and `DOUBLE` battle tests with some differences:
|
||||||
|
- opponent's action is specified by the `EXPECT_MOVE` / `EXPECT_SEND_OUT` / `EXPECT_SWITCH` commands
|
||||||
|
- we don't control what opponent actually does, instead we make sure the opponent does what we expect it to do
|
||||||
|
- we still control the player's action the same way
|
||||||
|
- apart from the `EXPECTED` commands, there's also a new `SCORE_` and `SCORE__VAL` commands
|
||||||
|
|
||||||
|
### `KNOWN_FAILING`
|
||||||
|
`KNOWN_FAILING;`
|
||||||
|
Marks a test as not passing due to a bug. If there is an issue number associated with the bug it should be included in a comment. If the test passes the developer will be notified to remove `KNOWN_FAILING`.
|
||||||
|
For example:
|
||||||
|
```
|
||||||
|
SINGLE_BATTLE_TEST("Jump Kick has no recoil if no target")
|
||||||
|
{
|
||||||
|
KNOWN_FAILING; // #2596.
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
### `PARAMETRIZE`
|
||||||
|
`PARAMETERIZE { parameter; }`
|
||||||
|
Runs a test multiple times. `i` will be set to which parameter is running, and `results` will contain an entry for each parameter, e.g.:
|
||||||
|
```
|
||||||
|
SINGLE_BATTLE_TEST("Blaze boosts Fire-type moves in a pinch", s16 damage)
|
||||||
|
{
|
||||||
|
u16 hp;
|
||||||
|
PARAMETRIZE { hp = 99; }
|
||||||
|
PARAMETRIZE { hp = 33; }
|
||||||
|
GIVEN {
|
||||||
|
ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE);
|
||||||
|
PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); MaxHP(99); HP(hp); }
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_EMBER); }
|
||||||
|
} SCENE {
|
||||||
|
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||||
|
} FINALLY {
|
||||||
|
EXPECT(results[1].damage > results[0].damage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
### `PASSES_RANDOMLY`
|
||||||
|
`PASSES_RANDOMLY(successes, trials, [tag])`
|
||||||
|
Checks that the test passes successes/trials. If `tag` is provided, the test is run for each value that the tag can produce. For example, to check that Paralysis causes the turn to be skipped 25/100 times, we can write the following test that passes only if the Pokémon is fully paralyzed and specify that we expect it to pass 25/100 times when `RNG_PARALYSIS` varies:
|
||||||
|
```
|
||||||
|
SINGLE_BATTLE_TEST("Paralysis has a 25% chance of skipping the turn")
|
||||||
|
{
|
||||||
|
PASSES_RANDOMLY(25, 100, RNG_PARALYSIS);
|
||||||
|
GIVEN {
|
||||||
|
PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_PARALYSIS); }
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_CELEBRATE); }
|
||||||
|
} SCENE {
|
||||||
|
MESSAGE("Wobbuffet is paralyzed! It can't move!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
All `BattleRandom` calls involving tag will return the same number, so this cannot be used to have two moves independently hit or miss, for example.
|
||||||
|
|
||||||
|
If the tag is not provided, runs the test 50 times and computes an approximate pass ratio.
|
||||||
|
`PASSES_RANDOMLY(gMovesInfo[move].accuracy, 100);`
|
||||||
|
Note that this mode of PASSES_RANDOMLY makes the tests run very slowly and should be avoided where possible. If the mechanic you are testing is missing its tag, you should add it.
|
||||||
|
|
||||||
|
### `GIVEN`
|
||||||
|
```
|
||||||
|
Given {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Contains the initial state of the parties before the battle.
|
||||||
|
|
||||||
|
## `RNGSeed`
|
||||||
|
`RNGSeed(seed)`
|
||||||
|
Explicitly sets the RNG seed. Try to avoid using this because it is a very fragile tool.
|
||||||
|
Example:
|
||||||
|
```
|
||||||
|
GIVEN {
|
||||||
|
RNGSeed(0xC0DEIDEA);
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `FLAG_SET`
|
||||||
|
`FLAG_SET(flagId)`
|
||||||
|
Sets the specified flag. Can currently only set one flag at a time.
|
||||||
|
Cleared between parameters and at the end of the test.
|
||||||
|
Example:
|
||||||
|
```
|
||||||
|
GIVEN {
|
||||||
|
FLAG_SET(FLAG_SYS_EXAMPLE_FLAG);
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `PLAYER` and `OPPONENT`
|
||||||
|
`PLAYER(species)` and `OPPONENT(species`
|
||||||
|
Adds the species to the player's or opponent's party respectively.
|
||||||
|
The Pokémon can be further customized with the following functions:
|
||||||
|
- `Gender(MON_MALE | MON_FEMALE)`
|
||||||
|
- `Nature(nature)`
|
||||||
|
- `Ability(ability)`
|
||||||
|
- `Level(level)`
|
||||||
|
- `MaxHP(n)`, `HP(n)`, `Attack(n)`, `Defense(n)`, `SpAttack(n)`, `SpDefense(n)`, `Speed(n)`
|
||||||
|
- `Item(item)`
|
||||||
|
- `Moves(moves...)`
|
||||||
|
- `Friendship(friendship)`
|
||||||
|
- `Status1(status1)`
|
||||||
|
For example to create a level 42 Wobbuffet that is poisoned:
|
||||||
|
`PLAYER(SPECIES_WOBBUFFET) { Level(42); Status1(STATUS1_POISON); }`
|
||||||
|
**Note if Speed is specified for any Pokémon then it must be specified for all Pokémon.**
|
||||||
|
**Note if Moves is specified then MOVE will not automatically add moves to the moveset.**
|
||||||
|
|
||||||
|
### `AI_FLAGS`
|
||||||
|
`AI_FLAGS(flags)`
|
||||||
|
Specifies which AI flags are run during the test. Has use only for AI tests.
|
||||||
|
The most common combination is `AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT)` which is the general 'smart' AI.
|
||||||
|
|
||||||
|
### `WHEN`
|
||||||
|
```
|
||||||
|
...
|
||||||
|
} WHEN {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Contains the choices that battlers make during the battle.
|
||||||
|
|
||||||
|
### `TURN`
|
||||||
|
`TURN { ... }`
|
||||||
|
Groups the choices made by the battlers on a single turn. If Speeds have not been explicitly specified then the order of the `MOVE` commands in the `TURN` will be used to infer the Speeds of the Pokémon, e.g.:
|
||||||
|
```
|
||||||
|
// player's speed will be greater than opponent's speed.
|
||||||
|
TURN { MOVE(player, MOVE_SPLASH); MOVE(opponent, MOVE_SPLASH); }
|
||||||
|
// opponent's speed will be greater than player's speed.
|
||||||
|
TURN { MOVE(opponent, MOVE_SPLASH); MOVE(player, MOVE_SPLASH); }
|
||||||
|
```
|
||||||
|
The inference process is naive, if your test contains anything that modifies the speed of a battler you should specify them explicitly.
|
||||||
|
|
||||||
|
### `MOVE`
|
||||||
|
`MOVE(battler, move | moveSlot:, [megaEvolve:], [hit:], [criticalHit:], [target:], [allowed:], [WITH_RNG(tag, value])`
|
||||||
|
Used when the battler chooses Fight. Either the move ID (e.g. `MOVE_TACKLE` or move slot must be specified.
|
||||||
|
- `megaEvolve: TRUE` causes the battler to Mega Evolve if able
|
||||||
|
- `hit: FALSE` causes the move to miss
|
||||||
|
- `criticalHit: TRUE` causes the move to land a critical hit
|
||||||
|
- `target:` is used in double battles to choose the target (when necessary)
|
||||||
|
- `allowed: FALSE` is used to reject an illegal move e.g. a Disabled one
|
||||||
|
- `WITH_RNG` allows the move to specify an explicit outcome for an RNG tag
|
||||||
|
```
|
||||||
|
MOVE(playerLeft, MOVE_TACKLE, target: opponentRight);
|
||||||
|
```
|
||||||
|
If the battler does not have an explicit Moves specified the moveset will be populated based on the `MOVE`s it uses.
|
||||||
|
|
||||||
|
### `FORCED_MOVE`
|
||||||
|
`FORCED_MOVE(battler)`
|
||||||
|
Used when the battler chooses Fight and then their move is chosen for them, e.g. when affected by Encore.
|
||||||
|
```
|
||||||
|
FORCED_MOVE(player);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `SWITCH`
|
||||||
|
`SWITCH(battler, partyIndex)`
|
||||||
|
Used when the battler chooses Switch.
|
||||||
|
```
|
||||||
|
SWITCH(player, 1);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `SKIP_TURN`
|
||||||
|
`SKIP_TURN(battler)`
|
||||||
|
Used when the battler cannot choose an action, e.g. when locked into Thrash.
|
||||||
|
```
|
||||||
|
SKIP_TURN(player);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `SEND_OUT`
|
||||||
|
`SEND_OUT(battler, partyIndex)`
|
||||||
|
Used when the battler chooses to switch to another Pokémon but not via Switch, e.g. after fainting or due to a U-turn.
|
||||||
|
```
|
||||||
|
SEND_OUT(player, 1);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `USE_ITEM`
|
||||||
|
`USE_ITEM(battler, itemId, [partyIndex:], [move:])`
|
||||||
|
Used when the battler chooses to use an item from the Bag. The item ID (e.g. ITEM_POTION) must be specified, and party index and move slot if applicable, e.g:
|
||||||
|
```
|
||||||
|
USE_ITEM(player, ITEM_X_ATTACK);
|
||||||
|
USE_ITEM(player, ITEM_POTION, partyIndex: 0);
|
||||||
|
USE_ITEM(player, ITEM_LEPPA_BERRY, partyIndex: 0, move: MOVE_TACKLE);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `SCENE`
|
||||||
|
```
|
||||||
|
...
|
||||||
|
} SCENE {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Contains an abridged description of the UI during the `THEN`. The order of the description must match too, e.g.
|
||||||
|
```
|
||||||
|
} SCENE {
|
||||||
|
// ABILITY_POPUP followed by a MESSAGE
|
||||||
|
ABILITY_POPUP(player, ABILITY_STURDY);
|
||||||
|
MESSAGE("Geodude was protected by Sturdy!");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `ABILITY_POPUP`
|
||||||
|
`ABILITY_POPUP(battler, [ability])`
|
||||||
|
Causes the test to fail if the battler's ability pop-up is not shown.
|
||||||
|
If specified, ability is the ability shown in the pop-up.
|
||||||
|
```
|
||||||
|
ABILITY_POPUP(opponent, ABILITY_MOLD_BREAKER);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `ANIMATION`
|
||||||
|
`ANIMATION(type, animId, [battler], [target:])`
|
||||||
|
Causes the test to fail if the animation does not play. A common use of this command is to check if a move was successful, e.g.:
|
||||||
|
```
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player);
|
||||||
|
```
|
||||||
|
`target` can only be specified for `ANIM_TYPE_MOVE`.
|
||||||
|
|
||||||
|
### `EXPERIENCE_BAR`
|
||||||
|
`EXPERIENCE_BAR(battler, [exp: | captureGainedExp:])`
|
||||||
|
If `exp:` is used, causes the test to fail if that amount of experience is not gained, e.g.:
|
||||||
|
```
|
||||||
|
EXPERIENCE_BAR(player, exp: 0);
|
||||||
|
```
|
||||||
|
If `captureGainedExp:` is used, causes the test to fail if the Experience bar does not change, and then writes that change to the pointer, e.g.:
|
||||||
|
```
|
||||||
|
u32 exp;
|
||||||
|
EXPERIENCE_BAR(player, captureGainedExp: &exp);
|
||||||
|
```
|
||||||
|
If none of the above are used, causes the test to fail if the Exp does not change at all.
|
||||||
|
**Please note that due to nature of tests, this command is only usable in `WILD_BATTLE_TEST` and will fail elsewhere.**
|
||||||
|
|
||||||
|
### `HP_BAR`
|
||||||
|
`HP_BAR(battler, [damage: | hp: | captureDamage: | captureHP:])`
|
||||||
|
If `hp:` or `damage:` are used, causes the test to fail if that amount of damage is not dealt, e.g.:
|
||||||
|
```
|
||||||
|
HP_BAR(player, hp: 0);
|
||||||
|
```
|
||||||
|
If `captureDamage:` or `captureHP:` are used, causes the test to fail if the HP bar does not change, and then writes that change to the
|
||||||
|
pointer, e.g.:
|
||||||
|
```
|
||||||
|
s16 damage;
|
||||||
|
HP_BAR(player, captureDamage: &damage);
|
||||||
|
```
|
||||||
|
If none of the above are used, causes the test to fail if the HP does not change at all.
|
||||||
|
|
||||||
|
### MESSAGE
|
||||||
|
`MESSAGE(pattern)`
|
||||||
|
Causes the test to fail if the message in pattern is not displayed.
|
||||||
|
Spaces in pattern match newlines (\n, \l, and \p) in the message.
|
||||||
|
Often used to check that a battler took its turn but it failed, e.g.:
|
||||||
|
```
|
||||||
|
MESSAGE("Wobbuffet used Dream Eater!");
|
||||||
|
MESSAGE("Foe Wobbuffet wasn't affected!");
|
||||||
|
```
|
||||||
|
|
||||||
|
### `STATUS_ICON`
|
||||||
|
`STATUS_ICON(battler, status1 | none: | sleep: | poison: | burn: | freeze: | paralysis:, badPoison:)`
|
||||||
|
Causes the test to fail if the battler's status is not changed to the specified status.
|
||||||
|
```
|
||||||
|
STATUS_ICON(player, badPoison: TRUE);
|
||||||
|
```
|
||||||
|
If the expected status icon is parametrized the corresponding `STATUS1` constant can be provided, e.g.:
|
||||||
|
```
|
||||||
|
u32 status1;
|
||||||
|
PARAMETRIZE { status1 = STATUS1_NONE; }
|
||||||
|
PARAMETRIZE { status1 = STATUS1_BURN; }
|
||||||
|
...
|
||||||
|
STATUS_ICON(player, status1);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `NOT`
|
||||||
|
`NOT sceneCommand`
|
||||||
|
Causes the test to fail if the `SCENE` command succeeds before the following command succeeds.
|
||||||
|
```
|
||||||
|
// Our Wobbuffet does not Celebrate before the foe's.
|
||||||
|
NOT MESSAGE("Wobbuffet used Celebrate!");
|
||||||
|
MESSAGE("Foe Wobbuffet used Celebrate!");
|
||||||
|
```
|
||||||
|
**NOTE**: If this condition fails, the viewable ROM freezes at the NOT command.
|
||||||
|
**WARNING: `NOT` is an alias of `NONE_OF`, so it behaves surprisingly when applied to multiple commands wrapped in braces.**
|
||||||
|
|
||||||
|
### `ONE_OF`
|
||||||
|
```
|
||||||
|
ONE_OF {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Causes the test to fail unless one of the `SCENE` commands succeeds.
|
||||||
|
```
|
||||||
|
ONE_OF {
|
||||||
|
MESSAGE("Wobbuffet used Celebrate!");
|
||||||
|
MESSAGE("Wobbuffet is paralyzed! It can't move!");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `NONE_OF`
|
||||||
|
```
|
||||||
|
NONE_OF {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Causes the test to fail if one of the `SCENE` commands succeeds before the command after the `NONE_OF` succeeds.
|
||||||
|
```
|
||||||
|
// Our Wobbuffet does not move before the foe's.
|
||||||
|
NONE_OF {
|
||||||
|
MESSAGE("Wobbuffet used Celebrate!");
|
||||||
|
MESSAGE("Wobbuffet is paralyzed! It can't move!");
|
||||||
|
}
|
||||||
|
MESSAGE("Foe Wobbuffet used Celebrate!");
|
||||||
|
```
|
||||||
|
|
||||||
|
### `PLAYER_PARTY`
|
||||||
|
Refer to the party members defined in `GIVEN`, e.g.:
|
||||||
|
```
|
||||||
|
s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP);
|
||||||
|
HP_BAR(player, damage: maxHP / 2);
|
||||||
|
```
|
||||||
|
### `OPPONENT_PARTY`
|
||||||
|
Refer to the party members defined in `GIVEN`, e.g.:
|
||||||
|
```
|
||||||
|
s32 maxHP = GetMonData(&OPPONENT_PARTY[0], MON_DATA_MAX_HP);
|
||||||
|
HP_BAR(opponent, damage: maxHP / 2);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `THEN`
|
||||||
|
```
|
||||||
|
...
|
||||||
|
} THEN {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Contains code to run after the battle has finished. If the test is using `PARAMETRIZE` commands then `EXPECT` commands between the results should go here. Is also occasionally used to check the internal battle state when checking the behavior via a `SCENE` is too difficult, verbose, or error-prone.
|
||||||
|
|
||||||
|
### `FINALLY`
|
||||||
|
```
|
||||||
|
...
|
||||||
|
} FINALLY {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Contains checks to run after all `PARAMETERIZE` commands have run. Prefer to write your checks in `THEN` where possible, because a failure in `THEN` will be tagged with which parameter it corresponds to.
|
||||||
|
|
||||||
|
### `EXPECT`
|
||||||
|
`EXPECT(cond)`
|
||||||
|
Causes the test to fail if `cond` is false.
|
||||||
|
|
||||||
|
### `EXPECT_XX`
|
||||||
|
`EXPECT_EQ(a, b)`
|
||||||
|
`a == b`
|
||||||
|
|
||||||
|
`EXPECT_NE(a, b)`
|
||||||
|
`a != b`
|
||||||
|
|
||||||
|
`EXPECT_LT(a, b)`
|
||||||
|
`a < b`
|
||||||
|
|
||||||
|
`EXPECT_LE(a, b)`
|
||||||
|
`a <= b`
|
||||||
|
|
||||||
|
`EXPECT_GT(a, b)`
|
||||||
|
`a > b`
|
||||||
|
|
||||||
|
`EXPECT_GE(a, b)`
|
||||||
|
`a >= b`
|
||||||
|
|
||||||
|
Causes the test to fail if a and b compare incorrectly, e.g.
|
||||||
|
```
|
||||||
|
EXPECT_EQ(results[0].damage, results[1].damage);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `EXPECT_MUL_EQ`
|
||||||
|
`EXPECT_MUL_EQ(a, m, b)`
|
||||||
|
Causes the test to fail if `a*m != b` (within a threshold), e.g.
|
||||||
|
```
|
||||||
|
// Expect results[0].damage * 1.5 == results[1].damage.
|
||||||
|
EXPECT_EQ(results[0].damage, Q_4_12(1.5), results[1].damage);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Overworld Command Reference
|
||||||
|
|
||||||
|
### `OVERWORLD_SCRIPT`
|
||||||
|
`OVERWORLD_SCRIPT(instructions...)`
|
||||||
|
Returns a pointer to a compiled overworld script. Cannot be used to initialize global `const` data, although the pointer **IS** to `const` data.
|
||||||
|
Note that each script command must be followed by a ;, e.g.:
|
||||||
|
```
|
||||||
|
const u8 *myScript = OVERWORLD_SCRIPT(
|
||||||
|
random 2;
|
||||||
|
addvar VAR_RESULT, 1;
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `RUN_OVERWORLD_SCRIPT`
|
||||||
|
`RUN_OVERWORLD_SCRIPT(instructions...)`
|
||||||
|
Runs an overworld script in the immediate script context, which means that commands like `waitstate` are not supported.
|
||||||
|
```
|
||||||
|
RUN_OVERWORLD_SCRIPT(
|
||||||
|
setvar VAR_RESULT, 3;
|
||||||
|
);
|
||||||
|
EXPECT_EQ(GetVar(VAR_RESULT), 3);
|
||||||
|
```
|
||||||
178
docs/how_to_trainer_class.md
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
# How to add a new trainer class
|
||||||
|
|
||||||
|
## Content
|
||||||
|
* [Quick Summary](#quick-summary)
|
||||||
|
* [The Graphics](#the-graphics)
|
||||||
|
* [1. Edit the sprites](#2-edit-the-sprites)
|
||||||
|
* [2. Register the sprites](#2-register-the-sprites)
|
||||||
|
* [3. The Animation](#2-the-animation)
|
||||||
|
* [4. Connecting pictures to the data](#2-connecting-pictures-to-the-data)
|
||||||
|
* [The Data](#the-data)
|
||||||
|
* [5. Defining the trainer class](#2-defining-the-trainer-class)
|
||||||
|
* [Usage](#usage)
|
||||||
|
|
||||||
|
## Quick Summary
|
||||||
|
(Page contains out of date information, [new instructions for Sprites here](https://github.com/rh-hideout/pokeemerald-expansion/pull/3597).)
|
||||||
|
If you've done this before and just need a quick lookup, here's what files you need:
|
||||||
|
1. GFX into [graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics)
|
||||||
|
2. Palette into [graphics/trainers/palettes](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/palettes)
|
||||||
|
3. Register sprites to [include/graphics.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/graphics.h)
|
||||||
|
4. Point game to where graphic files are found: [src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h)
|
||||||
|
5. Add animation to: [src/data/trainer_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_anims.h)
|
||||||
|
6. Add the trainer to all three structs in: [src/data/trainer_graphics/front_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_table.h)
|
||||||
|
7. Add trainer to [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h)
|
||||||
|
|
||||||
|
## The Graphics
|
||||||
|
|
||||||
|
### 1. Edit the sprites
|
||||||
|
We will start with a graphic that we want to use for our new trainer class. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder:
|
||||||
|
[graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics)
|
||||||
|
|
||||||
|
**Remember to limit yourself to 16 colors including transparency in the first slot!**
|
||||||
|
|
||||||
|
Export the pallette and place into the same folder.
|
||||||
|
|
||||||
|
### 2. Register the sprites
|
||||||
|
Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. First, create constants for the file paths.
|
||||||
|
Edit [include/graphics.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/graphics.h):
|
||||||
|
```diff
|
||||||
|
extern const u32 gTrainerFrontPic_RubySapphireMay[];
|
||||||
|
+ extern const u32 gTrainerFrontPic_myTrainerClass[];
|
||||||
|
|
||||||
|
extern const u32 gTrainerPalette_Hiker[];
|
||||||
|
...
|
||||||
|
|
||||||
|
...
|
||||||
|
extern const u32 gTrainerPalette_RubySapphireMay[];
|
||||||
|
+ extern const u32 gTrainerPalette_myTrainerClass[];
|
||||||
|
|
||||||
|
extern const u8 gTrainerBackPic_Brendan[];
|
||||||
|
```
|
||||||
|
|
||||||
|
Now link the graphic files.
|
||||||
|
[src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h):
|
||||||
|
```diff
|
||||||
|
const u32 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz");
|
||||||
|
|
||||||
|
const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_may_front_pic.4bpp.lz");
|
||||||
|
const u32 gTrainerPalette_RubySapphireMay[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz");
|
||||||
|
|
||||||
|
+ const u32 gTrainerFrontPic_Sheriff[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass_front_pic.4bpp.lz");
|
||||||
|
+ const u32 gTrainerPalette_Sheriff[] = INCBIN_U32("graphics/trainers/palettes/myTrainerClass.gbapal.lz");
|
||||||
|
|
||||||
|
const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan_back_pic.4
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. The Animation
|
||||||
|
Add the Animation of the trainer here:
|
||||||
|
[src/data/trainer_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_anims.h)
|
||||||
|
|
||||||
|
The trainers don't really move, but in theory they could, it's just that the animation defined for each trainer just shows one frame:
|
||||||
|
|
||||||
|
```diff
|
||||||
|
static const union AnimCmd *const sAnims_RubySapphireMay[] ={
|
||||||
|
sAnim_GeneralFrame0,
|
||||||
|
};
|
||||||
|
|
||||||
|
+ static const union AnimCmd *const sAnims_MyTrainerClass[] ={
|
||||||
|
+ sAnim_GeneralFrame0,
|
||||||
|
+ };
|
||||||
|
|
||||||
|
const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[] =
|
||||||
|
{
|
||||||
|
[TRAINER_PIC_HIKER] = sAnims_Hiker,
|
||||||
|
[TRAINER_PIC_AQUA_GRUNT_M] = sAnims_AquaGruntM,
|
||||||
|
[TRAINER_PIC_POKEMON_BREEDER_F] = sAnims_PokemonBreederF,
|
||||||
|
...
|
||||||
|
|
||||||
|
...
|
||||||
|
[TRAINER_PIC_RS_BRENDAN] = sAnims_RubySapphireBrendan,
|
||||||
|
[TRAINER_PIC_RS_MAY] = sAnims_RubySapphireMay,
|
||||||
|
+ [TRAINER_PIC_MYTRAINERCLASS] = sAnims_MyTrainerClass,
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Connecting the Pictures to the Data
|
||||||
|
The last few things we have to do is prepare the graphics for usage. In [src/data/trainer_graphics/front_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_table.h) you'll find the structs, we need to add the trainer to all of these. You can just copy the last trainer type defined and edit it, but as far as I understand, these are what they do:
|
||||||
|
|
||||||
|
1. gTrainerFrontPicCoords: Pretty self explanatory. Coordinates like size and offset on the y-axis to position the sprite on screen.
|
||||||
|
2. gTrainerFrontPicTable: Connects the trainer type with the image we defined earlier.
|
||||||
|
3. gTrainerFrontPicPaletteTable: Connects the trainer type with the palette we defined earlier.
|
||||||
|
|
||||||
|
So, finally, it needs to look like this:
|
||||||
|
```diff
|
||||||
|
const struct MonCoords gTrainerFrontPicCoords[] =
|
||||||
|
{
|
||||||
|
[TRAINER_PIC_HIKER] = {.size = 8, .y_offset = 1},
|
||||||
|
[TRAINER_PIC_AQUA_GRUNT_M] = {.size = 8, .y_offset = 1},
|
||||||
|
...
|
||||||
|
|
||||||
|
...
|
||||||
|
[TRAINER_PIC_RS_BRENDAN] = {.size = 8, .y_offset = 1},
|
||||||
|
[TRAINER_PIC_RS_MAY] = {.size = 8, .y_offset = 1},
|
||||||
|
+ [TRAINER_PIC_MYTRAINERCLASS] = {.size = 8, .y_offset = 1},
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TRAINER_SPRITE(trainerPic, sprite, size) [TRAINER_PIC_##trainerPic] = {sprite, size, TRAINER_PIC_##trainerPic}
|
||||||
|
|
||||||
|
const struct CompressedSpriteSheet gTrainerFrontPicTable[] =
|
||||||
|
{
|
||||||
|
TRAINER_SPRITE(HIKER, gTrainerFrontPic_Hiker, 0x800),
|
||||||
|
TRAINER_SPRITE(AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, 0x800),
|
||||||
|
TRAINER_SPRITE(POKEMON_BREEDER_F, gTrainerFrontPic_PokemonBreederF, 0x800),
|
||||||
|
TRAINER_SPRITE(COOLTRAINER_M, gTrainerFrontPic_CoolTrainerM, 0x800),
|
||||||
|
...
|
||||||
|
|
||||||
|
...
|
||||||
|
TRAINER_SPRITE(RS_BRENDAN, gTrainerFrontPic_RubySapphireBrendan, 0x800),
|
||||||
|
TRAINER_SPRITE(RS_MAY, gTrainerFrontPic_RubySapphireMay, 0x800),
|
||||||
|
+ TRAINER_SPRITE(MYTRAINERCLASS, gTrainerFrontPic_MyTrainerClass, 0x800),
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TRAINER_PAL(trainerPic, pal) [TRAINER_PIC_##trainerPic] = {pal, TRAINER_PIC_##trainerPic}
|
||||||
|
|
||||||
|
const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[] =
|
||||||
|
{
|
||||||
|
TRAINER_PAL(HIKER, gTrainerPalette_Hiker),
|
||||||
|
TRAINER_PAL(AQUA_GRUNT_M, gTrainerPalette_AquaGruntM),
|
||||||
|
TRAINER_PAL(POKEMON_BREEDER_F, gTrainerPalette_PokemonBreederF),
|
||||||
|
...
|
||||||
|
|
||||||
|
...
|
||||||
|
TRAINER_PAL(RS_BRENDAN, gTrainerPalette_RubySapphireBrendan),
|
||||||
|
TRAINER_PAL(RS_MAY, gTrainerPalette_RubySapphireMay),
|
||||||
|
+ TRAINER_PAL(MYTRAINERCLASS, gTrainerPalette_MyTrainerClass),
|
||||||
|
};
|
||||||
|
|
||||||
|
```
|
||||||
|
### The Data
|
||||||
|
#### 5. Defining the trainer class
|
||||||
|
Finally, let's bring it all together by defining our new trainer class in [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h):
|
||||||
|
|
||||||
|
```diff
|
||||||
|
#define TRAINER_PIC_RS_MAY 92
|
||||||
|
+ #define TRAINER_PIC_MYTRAINERCLASS 93
|
||||||
|
|
||||||
|
#define TRAINER_BACK_PIC_BRENDAN 0
|
||||||
|
#define TRAINER_BACK_PIC_MAY 1
|
||||||
|
```
|
||||||
|
Remember to count the number next to the trainer class up by one!
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
You can test your trainer type by going to [src/data/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h) and changing a trainer type. For example:
|
||||||
|
```diff
|
||||||
|
[TRAINER_BRENDAN_PLACEHOLDER] =
|
||||||
|
{
|
||||||
|
.partyFlags = 0,
|
||||||
|
.trainerClass = TRAINER_CLASS_RS_PROTAG,
|
||||||
|
.encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
|
||||||
|
- .trainerPic = TRAINER_PIC_RS_BRENDAN,
|
||||||
|
+ .trainerPic = TRAINER_PIC_MYTRAINERCLASS,
|
||||||
|
.trainerName = _("BRENDAN"),
|
||||||
|
.items = {},
|
||||||
|
.doubleBattle = FALSE,
|
||||||
|
.aiFlags = 0,
|
||||||
|
.partySize = ARRAY_COUNT(sParty_BrendanLinkPlaceholder),
|
||||||
|
.party = {.NoItemDefaultMoves = sParty_BrendanLinkPlaceholder},
|
||||||
|
},
|
||||||
|
```
|
||||||
2
docs/local_mdbook/index.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
## Running documentation website locally
|
||||||
|
- [Ubuntu WSL1/WSL2](/docs/local_mdbook/ubuntu_WSL.md)
|
||||||
51
docs/local_mdbook/ubuntu_WSL.md
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
Note: For further information beyond this very basic guide, please visit mdBook's [official documentation](https://rust-lang.github.io/mdBook/).
|
||||||
|
|
||||||
|
## Running documentation website locally (Ubuntu WSL1/WSL2)
|
||||||
|
### Previous Requirements:
|
||||||
|
- Option 1: Install via Rust toolchain
|
||||||
|
- Install Rust toolchain if you don't have it via the `sudo apt install cargo` command.
|
||||||
|
- Install mdBook via the `cargo install mdbook` command. Once finished, this message will pop up, with {USER} being your Ubuntu
|
||||||
|
```
|
||||||
|
warning: be sure to add `/home/{USER}/.cargo/bin` to your PATH to be able to run the installed binaries
|
||||||
|
```
|
||||||
|
- Add `/home/{USER}/.cargo/bin` to your PATH (with {USER} being the Ubuntu username.)
|
||||||
|
- Run command `nano ~/.profile` to edit the file.
|
||||||
|
- Add the following lines, ***replacing {USER} with your Linux username.***
|
||||||
|
```diff
|
||||||
|
# set PATH so it includes user's private bin if it exists
|
||||||
|
if [ -d "$HOME/bin" ] ; then
|
||||||
|
PATH="$HOME/bin:$PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# set PATH so it includes user's private bin if it exists
|
||||||
|
if [ -d "$HOME/.local/bin" ] ; then
|
||||||
|
PATH="$HOME/.local/bin:$PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
+# set PATH so it includes cargo bin if it exists
|
||||||
|
+if [ -d "/home/{USER}/.cargo/bin" ] ; then
|
||||||
|
+ PATH="/home/{USER}/.cargo/bin:$PATH"
|
||||||
|
+fi
|
||||||
|
```
|
||||||
|
- Run the `source ~/.profile` command to refresh the path in the current session.
|
||||||
|
- Option 2: Install downloaded binaries directly
|
||||||
|
- TODO: Add documentation of this process.
|
||||||
|
|
||||||
|
### Running the website
|
||||||
|
- Navigate to the `docs` folder on the repository.
|
||||||
|
- Run `mdbook serve`. Once started, you may now open the website on your browser by going to `http://127.0.0.1:3000`.
|
||||||
|
- Every change done to the `docs` folder will be reflected with an automatic refresh.
|
||||||
|
- To stop the server and go back to the terminal, press `Ctrl + C`.
|
||||||
|
|
||||||
|
### Modifying the website
|
||||||
|
- The navigation menu on the left is handled by `docs/SUMMARY.md`. Every file added needs to be added somewhere here in order to become visible, otherwise you'll get a 404 error.
|
||||||
|
- Any Markdown files (.md extension) added to the `docs/` directory will automatically be read by mdBook.
|
||||||
|
- To add Markdown files that are not in the `docs/` directory, you may create an empty `.md` file and add the following ***without the "----"***:
|
||||||
|
```md
|
||||||
|
{{ ----#include ../INSTALL.md}}`
|
||||||
|
```
|
||||||
|
This will include the `INSTALL.md` Markdown file from the root directory.
|
||||||
|
|
||||||
|
Once you're set up, you can now check your changes before pushing them to your repo! :D
|
||||||
|
|
||||||
|
We hope that this will make it easier for users to contribute to the documentation :)
|
||||||
@ -99,7 +99,7 @@ void *AllocInternal(void *heapStart, u32 size, const char *location)
|
|||||||
block = block->next;
|
block = block->next;
|
||||||
}
|
}
|
||||||
while (block != head);
|
while (block != head);
|
||||||
Test_ExitWithResult(TEST_RESULT_ERROR, "%s: OOM allocating %d bytes", location, size);
|
Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":L%s:%d, %s: OOM allocating %d bytes", gTestRunnerState.test->filename, SourceLine(0), location, size);
|
||||||
#endif
|
#endif
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,7 +52,6 @@ static void SortSprites(u32 *spritePriorities, s32 n);
|
|||||||
static u32 CreateSpriteAt(u32 index, const struct SpriteTemplate *template, s16 x, s16 y, u32 subpriority);
|
static u32 CreateSpriteAt(u32 index, const struct SpriteTemplate *template, s16 x, s16 y, u32 subpriority);
|
||||||
static void ResetOamMatrices(void);
|
static void ResetOamMatrices(void);
|
||||||
static void ResetSprite(struct Sprite *sprite);
|
static void ResetSprite(struct Sprite *sprite);
|
||||||
static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images);
|
|
||||||
static void ResetAllSprites(void);
|
static void ResetAllSprites(void);
|
||||||
static void BeginAnim(struct Sprite *sprite);
|
static void BeginAnim(struct Sprite *sprite);
|
||||||
static void ContinueAnim(struct Sprite *sprite);
|
static void ContinueAnim(struct Sprite *sprite);
|
||||||
@ -75,7 +74,6 @@ static void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite);
|
|||||||
static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite);
|
static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite);
|
||||||
static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix);
|
static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix);
|
||||||
static u8 GetSpriteMatrixNum(struct Sprite *sprite);
|
static u8 GetSpriteMatrixNum(struct Sprite *sprite);
|
||||||
static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip);
|
|
||||||
static void AffineAnimStateRestartAnim(u8 matrixNum);
|
static void AffineAnimStateRestartAnim(u8 matrixNum);
|
||||||
static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum);
|
static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum);
|
||||||
static void AffineAnimStateReset(u8 matrixNum);
|
static void AffineAnimStateReset(u8 matrixNum);
|
||||||
|
|||||||
@ -331,5 +331,7 @@ u8 SpriteTileAllocBitmapOp(u16 bit, u8 op);
|
|||||||
void ClearSpriteCopyRequests(void);
|
void ClearSpriteCopyRequests(void);
|
||||||
void ResetAffineAnimData(void);
|
void ResetAffineAnimData(void);
|
||||||
u32 GetSpanPerImage(u32 shape, u32 size);
|
u32 GetSpanPerImage(u32 shape, u32 size);
|
||||||
|
void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images);
|
||||||
|
void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip);
|
||||||
|
|
||||||
#endif //GUARD_SPRITE_H
|
#endif //GUARD_SPRITE_H
|
||||||
|
|||||||
BIN
graphics/battle_anims/sprites/beam.png
Normal file
|
After Width: | Height: | Size: 383 B |
BIN
graphics/battle_anims/sprites/blood_moon.png
Normal file
|
After Width: | Height: | Size: 714 B |
BIN
graphics/battle_anims/sprites/cudgel.png
Normal file
|
After Width: | Height: | Size: 319 B |
BIN
graphics/battle_anims/sprites/purple_chain.png
Normal file
|
After Width: | Height: | Size: 622 B |
BIN
graphics/battle_anims/sprites/red_explosion.png
Normal file
|
After Width: | Height: | Size: 946 B |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1001 B |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 737 B After Width: | Height: | Size: 627 B |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 983 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
@ -3,17 +3,17 @@ JASC-PAL
|
|||||||
16
|
16
|
||||||
60 184 151
|
60 184 151
|
||||||
0 0 0
|
0 0 0
|
||||||
21 12 31
|
120 200 248
|
||||||
0 0 0
|
160 224 248
|
||||||
102 69 138
|
102 69 138
|
||||||
212 190 233
|
212 190 233
|
||||||
149 111 190
|
149 111 190
|
||||||
41 28 44
|
41 28 44
|
||||||
233 232 233
|
232 204 232
|
||||||
190 163 198
|
190 163 198
|
||||||
162 126 172
|
162 126 172
|
||||||
120 200 248
|
203 181 209
|
||||||
160 224 248
|
255 255 255
|
||||||
56 56 56
|
56 56 56
|
||||||
24 24 24
|
24 24 24
|
||||||
15 15 15
|
0 0 0
|
||||||
|
|||||||
@ -3,17 +3,17 @@ JASC-PAL
|
|||||||
16
|
16
|
||||||
60 184 151
|
60 184 151
|
||||||
0 0 0
|
0 0 0
|
||||||
21 12 31
|
79 185 255
|
||||||
0 0 0
|
110 216 255
|
||||||
102 69 138
|
40 64 128
|
||||||
212 190 233
|
96 144 216
|
||||||
149 111 190
|
40 96 184
|
||||||
41 28 44
|
41 28 44
|
||||||
233 232 233
|
153 211 247
|
||||||
190 163 198
|
104 192 248
|
||||||
162 126 172
|
83 156 230
|
||||||
120 200 248
|
179 226 255
|
||||||
160 224 248
|
227 248 255
|
||||||
56 56 56
|
224 240 255
|
||||||
24 24 24
|
181 209 230
|
||||||
15 15 15
|
255 255 255
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 682 B After Width: | Height: | Size: 654 B |