Merge branch 'upcoming' into scriptCommands
@ -23,9 +23,10 @@ body:
|
||||
label: Version
|
||||
description: What version of pokeemerald-expansion are you using as a base?
|
||||
options:
|
||||
- 1.9.0 (Latest release)
|
||||
- 1.9.1 (Latest release)
|
||||
- master (default, unreleased bugfixes)
|
||||
- upcoming (Edge)
|
||||
- 1.9.0
|
||||
- 1.8.6
|
||||
- 1.8.5
|
||||
- 1.8.4
|
||||
|
||||
@ -23,9 +23,10 @@ body:
|
||||
label: Version
|
||||
description: What version of pokeemerald-expansion are you using as a base?
|
||||
options:
|
||||
- 1.9.0 (Latest release)
|
||||
- 1.9.1 (Latest release)
|
||||
- master (default, unreleased bugfixes)
|
||||
- upcoming (Edge)
|
||||
- 1.9.0
|
||||
- 1.8.6
|
||||
- 1.8.5
|
||||
- 1.8.4
|
||||
|
||||
3
.github/ISSUE_TEMPLATE/04_other_errors.yaml
vendored
@ -23,9 +23,10 @@ body:
|
||||
label: Version
|
||||
description: What version of pokeemerald-expansion are you using as a base?
|
||||
options:
|
||||
- 1.9.0 (Latest release)
|
||||
- 1.9.1 (Latest release)
|
||||
- master (default, unreleased bugfixes)
|
||||
- upcoming (Edge)
|
||||
- 1.9.0
|
||||
- 1.8.6
|
||||
- 1.8.5
|
||||
- 1.8.4
|
||||
|
||||
23
.github/workflows/build.yml
vendored
@ -15,19 +15,12 @@ jobs:
|
||||
GAME_VERSION: EMERALD
|
||||
GAME_REVISION: 0
|
||||
GAME_LANGUAGE: ENGLISH
|
||||
MODERN: 0
|
||||
COMPARE: 0
|
||||
UNUSED_ERROR: 1
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Checkout agbcc
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
path: agbcc
|
||||
repository: pret/agbcc
|
||||
|
||||
- name: Install binutils
|
||||
run: |
|
||||
sudo apt update
|
||||
@ -36,27 +29,13 @@ jobs:
|
||||
# gcc-arm-none-eabi is only needed for the modern build
|
||||
# as an alternative to dkP
|
||||
|
||||
- name: Install agbcc
|
||||
run: |
|
||||
./build.sh
|
||||
./install.sh ../
|
||||
working-directory: agbcc
|
||||
|
||||
- name: Agbcc
|
||||
- name: ROM
|
||||
env:
|
||||
MODERN: 0
|
||||
COMPARE: 0
|
||||
run: make -j${nproc} -O all
|
||||
|
||||
- name: Modern
|
||||
env:
|
||||
MODERN: 1
|
||||
COMPARE: 0
|
||||
run: make -j${nproc} -O all
|
||||
|
||||
- name: Test
|
||||
env:
|
||||
MODERN: 1
|
||||
TEST: 1
|
||||
run: |
|
||||
make -j${nproc} -O pokeemerald-test.elf
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
# 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
|
||||
|
||||
56
INSTALL.md
@ -327,7 +327,7 @@ If this works, then proceed to [Installation](#installation). Otherwise, ask for
|
||||
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**.
|
||||
|
||||
|
||||
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)
|
||||
@ -541,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.
|
||||
</details>
|
||||
|
||||
|
||||
Now you're ready to build pokeemerald Expansion.
|
||||
|
||||
## Build pokeemerald Expansion
|
||||
@ -596,58 +596,6 @@ To build **pokeemerald.elf** with debug symbols under a modern toolchain:
|
||||
```bash
|
||||
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
|
||||
|
||||
|
||||
109
Makefile
@ -25,10 +25,8 @@ AS := $(PREFIX)as
|
||||
|
||||
LD := $(PREFIX)ld
|
||||
|
||||
# note: the makefile must be set up so MODERNCC is never called
|
||||
# if MODERN=0
|
||||
MODERNCC := $(PREFIX)gcc
|
||||
PATH_MODERNCC := PATH="$(PATH)" $(MODERNCC)
|
||||
ARMCC := $(PREFIX)gcc
|
||||
PATH_ARMCC := PATH="$(PATH)" $(ARMCC)
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
@ -40,45 +38,20 @@ TITLE := POKEMON EMER
|
||||
GAME_CODE := BPEE
|
||||
MAKER_CODE := 01
|
||||
REVISION := 0
|
||||
MODERN ?= 1
|
||||
TEST ?= 0
|
||||
ANALYZE ?= 0
|
||||
UNUSED_ERROR ?= 0
|
||||
|
||||
ifeq (agbcc,$(MAKECMDGOALS))
|
||||
MODERN := 0
|
||||
endif
|
||||
|
||||
ifeq (check,$(MAKECMDGOALS))
|
||||
TEST := 1
|
||||
endif
|
||||
|
||||
# use arm-none-eabi-cpp for macOS
|
||||
# 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
|
||||
CPP := $(PREFIX)cpp
|
||||
|
||||
ROM_NAME := pokeemerald_agbcc.gba
|
||||
ROM_NAME := pokeemerald.gba
|
||||
ELF_NAME := $(ROM_NAME:.gba=.elf)
|
||||
MAP_NAME := $(ROM_NAME:.gba=.map)
|
||||
OBJ_DIR_NAME := build/emerald
|
||||
|
||||
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
|
||||
OBJ_DIR_NAME := build/modern
|
||||
|
||||
SHELL := bash -o pipefail
|
||||
|
||||
@ -86,14 +59,8 @@ ELF = $(ROM:.gba=.elf)
|
||||
MAP = $(ROM:.gba=.map)
|
||||
SYM = $(ROM:.gba=.sym)
|
||||
|
||||
TEST_OBJ_DIR_NAME_MODERN := build/modern-test
|
||||
TEST_OBJ_DIR_NAME_AGBCC := build/test
|
||||
TEST_OBJ_DIR_NAME := build/modern-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)
|
||||
HEADLESSELF = $(ROM:.gba=-test-headless.elf)
|
||||
|
||||
@ -116,17 +83,9 @@ SONG_BUILDDIR = $(OBJ_DIR)/$(SONG_SUBDIR)
|
||||
MID_BUILDDIR = $(OBJ_DIR)/$(MID_SUBDIR)
|
||||
TEST_BUILDDIR = $(OBJ_DIR)/$(TEST_SUBDIR)
|
||||
|
||||
ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=$(MODERN)
|
||||
ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=1
|
||||
|
||||
ifeq ($(MODERN),0)
|
||||
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
|
||||
CC1 = $(shell $(PATH_ARMCC) --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
|
||||
ifeq ($(ANALYZE),1)
|
||||
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
|
||||
endif
|
||||
endif
|
||||
ROM := $(MODERN_ROM_NAME)
|
||||
OBJ_DIR := $(MODERN_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))"
|
||||
ROM := $(ROM_NAME)
|
||||
OBJ_DIR := $(OBJ_DIR_NAME)
|
||||
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
|
||||
endif
|
||||
|
||||
ifeq ($(TESTELF),$(MAKECMDGOALS))
|
||||
TEST := 1
|
||||
@ -151,10 +109,7 @@ ifeq ($(TEST),1)
|
||||
OBJ_DIR := $(TEST_OBJ_DIR_NAME)
|
||||
endif
|
||||
|
||||
CPPFLAGS := -iquote include -iquote $(GFLIB_SUBDIR) -Wno-trigraphs -DMODERN=$(MODERN) -DTESTING=$(TEST)
|
||||
ifneq ($(MODERN),1)
|
||||
CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef
|
||||
endif
|
||||
CPPFLAGS := -iquote include -iquote $(GFLIB_SUBDIR) -Wno-trigraphs -DMODERN=1 -DTESTING=$(TEST)
|
||||
|
||||
SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c
|
||||
GFX := tools/gbagfx/gbagfx$(EXE)
|
||||
@ -301,26 +256,17 @@ mostlyclean: tidynonmodern tidymodern tidycheck
|
||||
rm -f $(AUTO_GEN_TARGETS)
|
||||
@$(MAKE) clean -C libagbsyscall
|
||||
|
||||
tidy: tidynonmodern tidymodern tidycheck
|
||||
tidy: tidymodern tidycheck
|
||||
|
||||
tidynonmodern:
|
||||
tidymodern:
|
||||
rm -f $(ROM_NAME) $(ELF_NAME) $(MAP_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:
|
||||
rm -f $(TESTELF) $(HEADLESSELF)
|
||||
rm -rf $(TEST_OBJ_DIR_NAME_MODERN)
|
||||
rm -rf $(TEST_OBJ_DIR_NAME_AGBCC)
|
||||
rm -rf $(TEST_OBJ_DIR_NAME)
|
||||
|
||||
|
||||
ifneq ($(MODERN),0)
|
||||
$(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member
|
||||
endif
|
||||
|
||||
include graphics_file_rules.mk
|
||||
include map_data_rules.mk
|
||||
include spritesheet_rules.mk
|
||||
@ -349,27 +295,11 @@ ifeq ($(COMPETITIVE_PARTY_SYNTAX),1)
|
||||
%.h: %.party tools ; $(CPP) $(CPPFLAGS) -traditional-cpp - < $< | $(TRAINERPROC) -o $@ -i $< -
|
||||
endif
|
||||
|
||||
ifeq ($(MODERN),0)
|
||||
$(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)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member
|
||||
$(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
|
||||
# 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
|
||||
endif
|
||||
|
||||
ifeq ($(DINFO),1)
|
||||
override CFLAGS += -g
|
||||
@ -488,13 +418,8 @@ $1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
|
||||
endef
|
||||
$(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_DEPS :=
|
||||
endif
|
||||
|
||||
$(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS)
|
||||
cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld
|
||||
@ -541,7 +466,7 @@ check: $(TESTELF)
|
||||
$(ROMTESTHYDRA) $(ROMTEST) $(OBJCOPY) $(HEADLESSELF)
|
||||
|
||||
libagbsyscall:
|
||||
@$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
|
||||
@$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=1
|
||||
|
||||
###################
|
||||
### 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.
|
||||
You can phrase it as the following:
|
||||
```
|
||||
Based off RHH's pokeemerald-expansion 1.9.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?
|
||||
|
||||
@ -1670,6 +1670,10 @@
|
||||
callnative BS_DamageToQuarterTargetHP
|
||||
.endm
|
||||
|
||||
.macro ficklebeamdamagecalculation
|
||||
callnative BS_FickleBeamDamageCalculation
|
||||
.endm
|
||||
|
||||
@ various command changed to more readable macros
|
||||
.macro cancelmultiturnmoves battler:req
|
||||
various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES
|
||||
|
||||
@ -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_ANGER
|
||||
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
|
||||
loopsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 4, 2
|
||||
createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, -20, -28
|
||||
@ -16250,6 +16256,49 @@ Move_RAGING_BULL::
|
||||
waitforvisualfinish
|
||||
restorebg
|
||||
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
|
||||
|
||||
@ Credits to Z-nogyroP. Simple anim that combines Force Palm + Fake Out
|
||||
@ -17013,44 +17062,618 @@ Move_AXE_KICK::
|
||||
createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 4
|
||||
end
|
||||
|
||||
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::
|
||||
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_SPIN_OUT::
|
||||
Move_POPULATION_BOMB::
|
||||
Move_GLAIVE_RUSH::
|
||||
Move_REVIVAL_BLESSING::
|
||||
Move_SALT_CURE::
|
||||
Move_TRIPLE_DIVE::
|
||||
Move_MORTAL_SPIN::
|
||||
Move_DOODLE::
|
||||
Move_FILLET_AWAY::
|
||||
Move_FLOWER_TRICK::
|
||||
Move_MAKE_IT_RAIN::
|
||||
Move_RUINATION::
|
||||
Move_COLLISION_COURSE::
|
||||
Move_ELECTRO_DRIFT::
|
||||
Move_SHED_TAIL::
|
||||
Move_HYPER_DRILL::
|
||||
Move_TWIN_BEAM::
|
||||
Move_ARMOR_CANNON::
|
||||
Move_COMEUPPANCE::
|
||||
Move_BLAZING_TORQUE::
|
||||
Move_WICKED_TORQUE::
|
||||
Move_NOXIOUS_TORQUE::
|
||||
Move_COMBAT_TORQUE::
|
||||
Move_MAGICAL_TORQUE::
|
||||
Move_PSYBLADE::
|
||||
Move_BLOOD_MOON::
|
||||
Move_MATCHA_GOTCHA::
|
||||
Move_TERA_STARSTORM::
|
||||
Move_FICKLE_BEAM::
|
||||
Move_THUNDERCLAP::
|
||||
Move_MIGHTY_CLEAVE::
|
||||
Move_TACHYON_CUTTER::
|
||||
Move_HARD_PRESS::
|
||||
Move_DRAGON_CHEER::
|
||||
Move_SUPERCELL_SLAM::
|
||||
Move_MALIGNANT_CHAIN::
|
||||
end @to do
|
||||
|
||||
@@@@@@@@@@@@@@@@@@@@@@@ GEN 1-3 @@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
@ -30,6 +30,19 @@ BattleScript_DamageToQuarterTargetHP::
|
||||
damagetoquartertargethp
|
||||
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::
|
||||
@ TODO: no string prints in S/V, but right now this helps with clarity
|
||||
printstring STRINGID_PKMNSTORINGENERGY
|
||||
@ -565,7 +578,7 @@ BattleScript_Teatimerod:
|
||||
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer
|
||||
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer
|
||||
printfromtable gStatUpStringIds
|
||||
waitmessage 0x40
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
moveendto MOVEEND_NEXT_TARGET
|
||||
jumpifnexttargetvalid BattleScript_TeatimeLoop
|
||||
moveendcase MOVEEND_CLEAR_BITS
|
||||
@ -577,7 +590,7 @@ BattleScript_Teatimemotor:
|
||||
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer
|
||||
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer
|
||||
printfromtable gStatUpStringIds
|
||||
waitmessage 0x40
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
moveendto MOVEEND_NEXT_TARGET
|
||||
jumpifnexttargetvalid BattleScript_TeatimeLoop
|
||||
moveendcase MOVEEND_CLEAR_BITS
|
||||
@ -865,6 +878,7 @@ BattleScript_OctlockTurnDmgEnd:
|
||||
|
||||
BattleScript_EffectPoltergeist::
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
attackstring
|
||||
ppreduce
|
||||
checkpoltergeist BS_TARGET, BattleScript_ButItFailed
|
||||
@ -914,19 +928,10 @@ BattleScript_BothCanNoLongerEscape::
|
||||
return
|
||||
|
||||
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
|
||||
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:
|
||||
printstring STRINGID_BUTHOOPACANTUSEIT
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
@ -7136,7 +7141,7 @@ BattleScript_TargetFormChangeWithStringNoPopup::
|
||||
|
||||
BattleScript_BattlerFormChangeWithStringEnd3::
|
||||
pause 5
|
||||
call BattleScript_AbilityPopUp
|
||||
call BattleScript_AbilityPopUpScripting
|
||||
flushtextbox
|
||||
handleformchange BS_SCRIPTING, 0
|
||||
handleformchange BS_SCRIPTING, 1
|
||||
@ -7740,6 +7745,15 @@ BattleScript_CheekPouchActivates::
|
||||
copybyte gBattlerAttacker, sSAVED_BATTLER
|
||||
return
|
||||
|
||||
BattleScript_PickupActivates::
|
||||
pause 5
|
||||
tryrecycleitem BattleScript_PickupActivatesEnd
|
||||
call BattleScript_AbilityPopUp
|
||||
printstring STRINGID_XFOUNDONEY
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
BattleScript_PickupActivatesEnd:
|
||||
end3
|
||||
|
||||
BattleScript_HarvestActivates::
|
||||
pause 5
|
||||
tryrecycleitem BattleScript_HarvestActivatesEnd
|
||||
@ -7987,7 +8001,7 @@ BattleScript_DeltaStreamActivates::
|
||||
end3
|
||||
|
||||
BattleScript_ProtosynthesisActivates::
|
||||
call BattleScript_AbilityPopUp
|
||||
call BattleScript_AbilityPopUpScripting
|
||||
printstring STRINGID_SUNLIGHTACTIVATEDABILITY
|
||||
waitmessage B_WAIT_TIME_MED
|
||||
printstring STRINGID_STATWASHEIGHTENED
|
||||
|
||||
@ -45,7 +45,7 @@ BattleScript_UseItemMessage:
|
||||
printfromtable gTrainerUsedItemStringIds
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
return
|
||||
|
||||
|
||||
BattleScript_ItemRestoreHPRet:
|
||||
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
|
||||
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
|
||||
|
||||
@ -59,6 +59,6 @@ def rellocate_follower_graphics():
|
||||
#os.popen('cp followers/' + name + '.png followers/' + name + '/follower.png')
|
||||
#os.remove('followers/' + name + '.png')
|
||||
#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()
|
||||
|
||||
@ -3,6 +3,8 @@
|
||||
- [README](./README.md)
|
||||
- [Installation](./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)
|
||||
@ -10,10 +12,10 @@
|
||||
- [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.0](./how_to_new_pokemon_1_9_0.md)
|
||||
- [v1.8.0](./how_to_new_pokemon_1_8_0.md)
|
||||
- [v1.7.0](./how_to_new_pokemon_1_7_0.md)
|
||||
- [v1.6.0](./how_to_new_pokemon_1_6_0.md)
|
||||
- [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)
|
||||
- [1.9.x]()
|
||||
|
||||
@ -21,14 +21,14 @@ AI: Check Bad Move / Try to Faint / Check Viability. The name of each flag is ju
|
||||
* 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:
|
||||
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.
|
||||
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).
|
||||
@ -58,12 +58,12 @@ AI will generally behave more recklessly. This AI enables the following behaviou
|
||||
* Prioritize Explosion moves
|
||||
|
||||
## `AI_FLAG_PREFER_STRONGEST_MOVE`
|
||||
Adds score bonus to any move the AI has that either OHKOs or 2HKOs the player.
|
||||
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 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:
|
||||
@ -83,7 +83,7 @@ With respect to the AI’s mons, in doubles:
|
||||
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
|
||||
* 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
|
||||
@ -96,7 +96,7 @@ AI prioritizes setting up field effects (Trick Room, Rain Dance, etc.) and side
|
||||
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 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.
|
||||
@ -127,7 +127,7 @@ Affects when the AI chooses to switch. AI will make smarter decisions about when
|
||||
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 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.
|
||||
@ -148,7 +148,7 @@ And will choose mons after a mid-battle switch prioritizing the following criter
|
||||
* Has Baton Pass
|
||||
|
||||
## `AI_FLAG_CONSERVATIVE`
|
||||
AI always assumes it will roll the lowest possible result when comparing damage in scoring.
|
||||
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.
|
||||
|
||||
@ -92,5 +92,5 @@
|
||||
* Court Change by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3160
|
||||
* Item Effects
|
||||
* 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
|
||||
@ -9,8 +9,8 @@
|
||||
## 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
|
||||
- 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
|
||||
* Crocalor
|
||||
* Dolliv
|
||||
* Dudunsparce
|
||||
* Dudunsparce
|
||||
* Esparthra
|
||||
### Fixed
|
||||
* Multiple Pokémon graphical fixes by @katykat5099 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3805
|
||||
|
||||
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-->
|
||||
@ -122,7 +122,10 @@
|
||||
### Fixed
|
||||
* N/A
|
||||
|
||||
## 📦 Pret merges 📦
|
||||
## 📦 Branch Synchronisation 📦
|
||||
### pret's base pokeemerald
|
||||
* N/A
|
||||
### merrp/aarant's followers
|
||||
* N/A
|
||||
|
||||
|
||||
|
||||
@ -384,7 +384,7 @@ Edit [src/data/text/species_names.h](https://github.com/rh-hideout/pokeemerald-e
|
||||
const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1] = {
|
||||
[SPECIES_NONE] = _("??????????"),
|
||||
[SPECIES_BULBASAUR] = _("Bulbasaur"),
|
||||
...
|
||||
...
|
||||
[SPECIES_ENAMORUS] = _("Enamorus"),
|
||||
+ [SPECIES_MEWTHREE] = _("Mewthree"),
|
||||
};
|
||||
@ -482,7 +482,7 @@ Append to [src/data/pokemon/pokedex_text.h](https://github.com/rh-hideout/pokeem
|
||||
"winter. According to legend, this\n"
|
||||
"Pokémon's love gives rise to the\n"
|
||||
"budding of fresh life across the land.");
|
||||
|
||||
|
||||
+const u8 gMewthreePokedexText[] = _(
|
||||
+ "The rumors became true.\n"
|
||||
+ "This is Mews final form.\n"
|
||||
@ -509,7 +509,7 @@ Edit [src/data/pokemon/pokedex_entries.h](https://github.com/rh-hideout/pokeemer
|
||||
.trainerScale = 296,
|
||||
.trainerOffset = 1,
|
||||
},
|
||||
|
||||
|
||||
+ [NATIONAL_DEX_MEWTHREE] =
|
||||
+ {
|
||||
+ .categoryName = _("NEW SPECIES"),
|
||||
@ -553,7 +553,7 @@ Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemera
|
||||
NATIONAL_DEX_DUGTRIO,
|
||||
...
|
||||
};
|
||||
|
||||
|
||||
const u16 gPokedexOrder_Height[] =
|
||||
{
|
||||
...
|
||||
@ -598,7 +598,7 @@ Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald
|
||||
},
|
||||
|
||||
+ [SPECIES_MEWTHREE] =
|
||||
+ {
|
||||
+ {
|
||||
+ .baseHP = 106,
|
||||
+ .baseAttack = 150,
|
||||
+ .baseDefense = 70,
|
||||
|
||||
@ -170,7 +170,7 @@ Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald
|
||||
},
|
||||
|
||||
+ [SPECIES_MEWTHREE] =
|
||||
+ {
|
||||
+ {
|
||||
+ .baseHP = 106,
|
||||
+ .baseAttack = 150,
|
||||
+ .baseDefense = 70,
|
||||
@ -234,7 +234,7 @@ That's all the basic fields present in vanilla emerald, so now let's take a look
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.isLegendary = TRUE,
|
||||
.allPerfectIVs = TRUE,
|
||||
@ -309,7 +309,7 @@ Lastly, we add the cry to our species entry
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.isLegendary = TRUE,
|
||||
.allPerfectIVs = TRUE,
|
||||
@ -388,7 +388,7 @@ Now we can add the number and entry to our Mewthree:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.cryId = CRY_MEWTHREE,
|
||||
+ .natDexNum = NATIONAL_DEX_MEWTHREE,
|
||||
@ -409,7 +409,7 @@ Now we can add the number and entry to our Mewthree:
|
||||
```
|
||||

|
||||
|
||||
The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex.
|
||||
The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex.
|
||||
|
||||
`height` and `weight` are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters).
|
||||
|
||||
@ -443,7 +443,7 @@ Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemera
|
||||
NATIONAL_DEX_DUGTRIO,
|
||||
...
|
||||
};
|
||||
|
||||
|
||||
const u16 gPokedexOrder_Height[] =
|
||||
{
|
||||
...
|
||||
@ -560,7 +560,7 @@ Now that we have all the external data ready, we just need to add it to `gSpecie
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.pokemonScale = 256,
|
||||
.pokemonOffset = 0,
|
||||
@ -612,7 +612,7 @@ Let's explain each of these:
|
||||
- Used to define what Y position of the back sprite. When working with the animation debug menu, we recommend aligning the back sprite to the white background, as it was designed to properyly align with the real battle layout.
|
||||
- `backAnimId`:
|
||||
- Like `frontAnimId` except for the back sprites and them being a single frame. The IDs listed [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h) are used to represent 3 different animations that happen based on the the Pokémon's nature.
|
||||
- `PALETTES`
|
||||
- `PALETTES`
|
||||
- This macro was created to handle both regular and shiny palettes of a Pokémon. It just needs the species suffix to call the corresponding palette.
|
||||
```c
|
||||
#define PALETTES(pal) \
|
||||
@ -650,7 +650,7 @@ We're almost there just a bit left!
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE },
|
||||
.bodyColor = BODY_COLOR_PURPLE,
|
||||
@ -745,7 +745,7 @@ Again, we need to register the learnset in `gSpeciesInfo`:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
PALETTES(Mewthree),
|
||||
ICON(Mewthree, 2),
|
||||
@ -846,7 +846,7 @@ Once more, we need to register the learnset in `gSpeciesInfo`:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
FOOTPRINT(Mewthree)
|
||||
.levelUpLearnset = sMewthreeLevelUpLearnset,
|
||||
@ -869,7 +869,7 @@ Edit `gSpeciesInfo`:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTWO] =
|
||||
{
|
||||
{
|
||||
...
|
||||
FOOTPRINT(Mewtwo)
|
||||
.isLegendary = TRUE,
|
||||
|
||||
@ -181,7 +181,7 @@ Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald
|
||||
},
|
||||
|
||||
+ [SPECIES_MEWTHREE] =
|
||||
+ {
|
||||
+ {
|
||||
+ .baseHP = 106,
|
||||
+ .baseAttack = 150,
|
||||
+ .baseDefense = 70,
|
||||
@ -245,7 +245,7 @@ That's all the basic fields present in vanilla emerald, so now let's take a look
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.isLegendary = TRUE,
|
||||
.allPerfectIVs = TRUE,
|
||||
@ -320,7 +320,7 @@ Lastly, we add the cry to our species entry
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.isLegendary = TRUE,
|
||||
.allPerfectIVs = TRUE,
|
||||
@ -399,7 +399,7 @@ Now we can add the number and entry to our Mewthree:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.cryId = CRY_MEWTHREE,
|
||||
+ .natDexNum = NATIONAL_DEX_MEWTHREE,
|
||||
@ -420,7 +420,7 @@ Now we can add the number and entry to our Mewthree:
|
||||
```
|
||||

|
||||
|
||||
The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex.
|
||||
The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex.
|
||||
|
||||
`height` and `weight` are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters).
|
||||
|
||||
@ -454,7 +454,7 @@ Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemera
|
||||
NATIONAL_DEX_DUGTRIO,
|
||||
...
|
||||
};
|
||||
|
||||
|
||||
const u16 gPokedexOrder_Height[] =
|
||||
{
|
||||
...
|
||||
@ -571,7 +571,7 @@ Now that we have all the external data ready, we just need to add it to `gSpecie
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.pokemonScale = 256,
|
||||
.pokemonOffset = 0,
|
||||
@ -651,7 +651,7 @@ We're almost there just a bit left!
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE },
|
||||
.bodyColor = BODY_COLOR_PURPLE,
|
||||
@ -746,7 +746,7 @@ Again, we need to register the learnset in `gSpeciesInfo`:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
PALETTES(Mewthree),
|
||||
ICON(Mewthree, 2),
|
||||
@ -847,7 +847,7 @@ Once more, we need to register the learnset in `gSpeciesInfo`:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
FOOTPRINT(Mewthree)
|
||||
.levelUpLearnset = sMewthreeLevelUpLearnset,
|
||||
@ -870,7 +870,7 @@ Edit `gSpeciesInfo`:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTWO] =
|
||||
{
|
||||
{
|
||||
...
|
||||
FOOTPRINT(Mewtwo)
|
||||
.isLegendary = TRUE,
|
||||
|
||||
@ -176,7 +176,7 @@ Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald
|
||||
},
|
||||
|
||||
+ [SPECIES_MEWTHREE] =
|
||||
+ {
|
||||
+ {
|
||||
+ .baseHP = 106,
|
||||
+ .baseAttack = 150,
|
||||
+ .baseDefense = 70,
|
||||
@ -240,7 +240,7 @@ That's all the basic fields present in vanilla emerald, so now let's take a look
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.isLegendary = TRUE,
|
||||
.allPerfectIVs = TRUE,
|
||||
@ -315,7 +315,7 @@ Lastly, we add the cry to our species entry
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.isLegendary = TRUE,
|
||||
.allPerfectIVs = TRUE,
|
||||
@ -394,7 +394,7 @@ Now we can add the number and entry to our Mewthree:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.cryId = CRY_MEWTHREE,
|
||||
+ .natDexNum = NATIONAL_DEX_MEWTHREE,
|
||||
@ -415,7 +415,7 @@ Now we can add the number and entry to our Mewthree:
|
||||
```
|
||||

|
||||
|
||||
The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex.
|
||||
The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex.
|
||||
|
||||
`height` and `weight` are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters).
|
||||
|
||||
@ -449,7 +449,7 @@ Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemera
|
||||
NATIONAL_DEX_DUGTRIO,
|
||||
...
|
||||
};
|
||||
|
||||
|
||||
const u16 gPokedexOrder_Height[] =
|
||||
{
|
||||
...
|
||||
@ -566,7 +566,7 @@ Now that we have all the external data ready, we just need to add it to `gSpecie
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.pokemonScale = 256,
|
||||
.pokemonOffset = 0,
|
||||
@ -646,7 +646,7 @@ We're almost there just a bit left!
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
.abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE },
|
||||
.bodyColor = BODY_COLOR_PURPLE,
|
||||
@ -745,7 +745,7 @@ Again, we need to register the learnset in `gSpeciesInfo`:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
PALETTES(Mewthree),
|
||||
ICON(Mewthree, 2),
|
||||
@ -846,7 +846,7 @@ Once more, we need to register the learnset in `gSpeciesInfo`:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
FOOTPRINT(Mewthree)
|
||||
.levelUpLearnset = sMewthreeLevelUpLearnset,
|
||||
@ -869,7 +869,7 @@ Edit `gSpeciesInfo`:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTWO] =
|
||||
{
|
||||
{
|
||||
...
|
||||
FOOTPRINT(Mewtwo)
|
||||
.isLegendary = TRUE,
|
||||
@ -1097,7 +1097,7 @@ And finally, in `gSpeciesInfo`:
|
||||
{
|
||||
...
|
||||
[SPECIES_MEWTHREE] =
|
||||
{
|
||||
{
|
||||
...
|
||||
FOOTPRINT(Mewthree)
|
||||
+ OVERWORLD(
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
# 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:
|
||||
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
|
||||
@ -48,21 +48,21 @@ SINGLE_BATTLE_TEST("Stun Spore inflicts paralysis")
|
||||
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.
|
||||
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'`
|
||||
`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.
|
||||
`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.
|
||||
`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.
|
||||
`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:
|
||||
@ -90,8 +90,8 @@ SINGLE_BATTLE_TEST("Stun Spore does not affect Grass-types")
|
||||
}
|
||||
}
|
||||
```
|
||||
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 `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
|
||||
@ -131,9 +131,9 @@ SINGLE_BATTLE_TEST("Meditate raises Attack", s16 damage)
|
||||
}
|
||||
```
|
||||
|
||||
`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.
|
||||
`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.
|
||||
@ -144,8 +144,8 @@ The overworld is not available, so it is only possible to test commands which do
|
||||
## 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(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`
|
||||
@ -164,16 +164,16 @@ ASSUMPTIONS
|
||||
```
|
||||
|
||||
### `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.
|
||||
`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...)`
|
||||
`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.
|
||||
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
|
||||
@ -182,7 +182,7 @@ The rules remain the same as with the `SINGLE` and `DOUBLE` battle tests with so
|
||||
|
||||
### `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`.
|
||||
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")
|
||||
@ -192,7 +192,7 @@ SINGLE_BATTLE_TEST("Jump Kick has no recoil if no target")
|
||||
}
|
||||
```
|
||||
### `PARAMETRIZE`
|
||||
`PARAMETERIZE { parameter; }`
|
||||
`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)
|
||||
@ -246,7 +246,7 @@ 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.
|
||||
Explicitly sets the RNG seed. Try to avoid using this because it is a very fragile tool.
|
||||
Example:
|
||||
```
|
||||
GIVEN {
|
||||
@ -256,10 +256,10 @@ GIVEN {
|
||||
```
|
||||
|
||||
### `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:
|
||||
`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);
|
||||
@ -268,8 +268,8 @@ GIVEN {
|
||||
```
|
||||
|
||||
### `PLAYER` and `OPPONENT`
|
||||
`PLAYER(species)` and `OPPONENT(species`
|
||||
Adds the species to the player's or opponent's party respectively.
|
||||
`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)`
|
||||
@ -280,14 +280,14 @@ The Pokémon can be further customized with the following functions:
|
||||
- `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.**
|
||||
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.
|
||||
`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`
|
||||
@ -300,8 +300,8 @@ The most common combination is `AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_
|
||||
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.:
|
||||
`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); }
|
||||
@ -311,7 +311,7 @@ Groups the choices made by the battlers on a single turn. If Speeds have not bee
|
||||
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])`
|
||||
`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
|
||||
@ -325,35 +325,35 @@ Used when the battler chooses Fight. Either the move ID (e.g. `MOVE_TACKLE` or m
|
||||
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)`
|
||||
`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)`
|
||||
`SWITCH(battler, partyIndex)`
|
||||
Used when the battler chooses Switch.
|
||||
```
|
||||
SWITCH(player, 1);
|
||||
```
|
||||
|
||||
### `SKIP_TURN`
|
||||
`SKIP_TURN(battler)`
|
||||
`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)`
|
||||
`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:])`
|
||||
`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);
|
||||
@ -378,15 +378,15 @@ Contains an abridged description of the UI during the `THEN`. The order of the d
|
||||
```
|
||||
|
||||
### `ABILITY_POPUP`
|
||||
`ABILITY_POPUP(battler, [ability])`
|
||||
Causes the test to fail if the battler's ability pop-up is not shown.
|
||||
`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:])`
|
||||
`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);
|
||||
@ -394,7 +394,7 @@ Causes the test to fail if the animation does not play. A common use of this com
|
||||
`target` can only be specified for `ANIM_TYPE_MOVE`.
|
||||
|
||||
### `EXPERIENCE_BAR`
|
||||
`EXPERIENCE_BAR(battler, [exp: | captureGainedExp:])`
|
||||
`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);
|
||||
@ -404,11 +404,11 @@ If `captureGainedExp:` is used, causes the test to fail if the Experience bar do
|
||||
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.
|
||||
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:])`
|
||||
`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);
|
||||
@ -422,9 +422,9 @@ If `captureDamage:` or `captureHP:` are used, causes the test to fail if the HP
|
||||
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.
|
||||
`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!");
|
||||
@ -432,7 +432,7 @@ Often used to check that a battler took its turn but it failed, e.g.:
|
||||
```
|
||||
|
||||
### `STATUS_ICON`
|
||||
`STATUS_ICON(battler, status1 | none: | sleep: | poison: | burn: | freeze: | paralysis:, badPoison:)`
|
||||
`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);
|
||||
@ -447,7 +447,7 @@ If the expected status icon is parametrized the corresponding `STATUS1` constant
|
||||
```
|
||||
|
||||
### `NOT`
|
||||
`NOT sceneCommand`
|
||||
`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.
|
||||
@ -519,27 +519,27 @@ Contains code to run after the battle has finished. If the test is using `PARAME
|
||||
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)`
|
||||
`EXPECT(cond)`
|
||||
Causes the test to fail if `cond` is false.
|
||||
|
||||
### `EXPECT_XX`
|
||||
`EXPECT_EQ(a, b)`
|
||||
`a == b`
|
||||
`EXPECT_EQ(a, b)`
|
||||
`a == b`
|
||||
|
||||
`EXPECT_NE(a, b)`
|
||||
`a != b`
|
||||
`EXPECT_NE(a, b)`
|
||||
`a != b`
|
||||
|
||||
`EXPECT_LT(a, b)`
|
||||
`a < b`
|
||||
`EXPECT_LT(a, b)`
|
||||
`a < b`
|
||||
|
||||
`EXPECT_LE(a, b)`
|
||||
`a <= b`
|
||||
`EXPECT_LE(a, b)`
|
||||
`a <= b`
|
||||
|
||||
`EXPECT_GT(a, b)`
|
||||
`a > b`
|
||||
`EXPECT_GT(a, b)`
|
||||
`a > b`
|
||||
|
||||
`EXPECT_GE(a, b)`
|
||||
`a >= b`
|
||||
`EXPECT_GE(a, b)`
|
||||
`a >= b`
|
||||
|
||||
Causes the test to fail if a and b compare incorrectly, e.g.
|
||||
```
|
||||
@ -547,7 +547,7 @@ Causes the test to fail if a and b compare incorrectly, e.g.
|
||||
```
|
||||
|
||||
### `EXPECT_MUL_EQ`
|
||||
`EXPECT_MUL_EQ(a, m, b)`
|
||||
`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.
|
||||
@ -557,7 +557,7 @@ Causes the test to fail if a and b compare incorrectly, e.g.
|
||||
## Overworld Command Reference
|
||||
|
||||
### `OVERWORLD_SCRIPT`
|
||||
`OVERWORLD_SCRIPT(instructions...)`
|
||||
`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.:
|
||||
```
|
||||
@ -568,7 +568,7 @@ const u8 *myScript = OVERWORLD_SCRIPT(
|
||||
```
|
||||
|
||||
### `RUN_OVERWORLD_SCRIPT`
|
||||
`RUN_OVERWORLD_SCRIPT(instructions...)`
|
||||
`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(
|
||||
|
||||
@ -12,13 +12,13 @@
|
||||
* [Usage](#usage)
|
||||
|
||||
## Quick Summary
|
||||
(Page contains out of date information, [new instructions for Sprites here](https://github.com/rh-hideout/pokeemerald-expansion/pull/3597).)
|
||||
(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)
|
||||
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)
|
||||
|
||||
|
||||
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 :)
|
||||
@ -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 void ResetOamMatrices(void);
|
||||
static void ResetSprite(struct Sprite *sprite);
|
||||
static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images);
|
||||
static void ResetAllSprites(void);
|
||||
static void BeginAnim(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 CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix);
|
||||
static u8 GetSpriteMatrixNum(struct Sprite *sprite);
|
||||
static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip);
|
||||
static void AffineAnimStateRestartAnim(u8 matrixNum);
|
||||
static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum);
|
||||
static void AffineAnimStateReset(u8 matrixNum);
|
||||
|
||||
@ -331,5 +331,7 @@ u8 SpriteTileAllocBitmapOp(u16 bit, u8 op);
|
||||
void ClearSpriteCopyRequests(void);
|
||||
void ResetAffineAnimData(void);
|
||||
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
|
||||
|
||||
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/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
|
||||
60 184 151
|
||||
0 0 0
|
||||
21 12 31
|
||||
0 0 0
|
||||
120 200 248
|
||||
160 224 248
|
||||
102 69 138
|
||||
212 190 233
|
||||
149 111 190
|
||||
41 28 44
|
||||
233 232 233
|
||||
232 204 232
|
||||
190 163 198
|
||||
162 126 172
|
||||
120 200 248
|
||||
160 224 248
|
||||
203 181 209
|
||||
255 255 255
|
||||
56 56 56
|
||||
24 24 24
|
||||
15 15 15
|
||||
0 0 0
|
||||
|
||||
@ -3,17 +3,17 @@ JASC-PAL
|
||||
16
|
||||
60 184 151
|
||||
0 0 0
|
||||
21 12 31
|
||||
0 0 0
|
||||
102 69 138
|
||||
212 190 233
|
||||
149 111 190
|
||||
79 185 255
|
||||
110 216 255
|
||||
40 64 128
|
||||
96 144 216
|
||||
40 96 184
|
||||
41 28 44
|
||||
233 232 233
|
||||
190 163 198
|
||||
162 126 172
|
||||
120 200 248
|
||||
160 224 248
|
||||
56 56 56
|
||||
24 24 24
|
||||
15 15 15
|
||||
153 211 247
|
||||
104 192 248
|
||||
83 156 230
|
||||
179 226 255
|
||||
227 248 255
|
||||
224 240 255
|
||||
181 209 230
|
||||
255 255 255
|
||||
|
||||
|
Before Width: | Height: | Size: 682 B After Width: | Height: | Size: 654 B |
|
Before Width: | Height: | Size: 623 B After Width: | Height: | Size: 641 B |
@ -10,7 +10,7 @@ JASC-PAL
|
||||
0 0 0
|
||||
200 200 200
|
||||
0 168 216
|
||||
0 0 0
|
||||
248 224 88
|
||||
0 0 0
|
||||
0 0 0
|
||||
0 0 0
|
||||
|
||||
@ -10,7 +10,7 @@ JASC-PAL
|
||||
0 0 0
|
||||
200 200 200
|
||||
24 232 104
|
||||
0 0 0
|
||||
248 224 88
|
||||
0 0 0
|
||||
0 0 0
|
||||
0 0 0
|
||||
|
||||
|
Before Width: | Height: | Size: 897 B After Width: | Height: | Size: 877 B |
|
Before Width: | Height: | Size: 467 B After Width: | Height: | Size: 424 B |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 524 B |
@ -2,11 +2,11 @@ JASC-PAL
|
||||
0100
|
||||
16
|
||||
255 255 255
|
||||
225 232 232
|
||||
247 240 184
|
||||
216 192 248
|
||||
232 200 0
|
||||
160 128 240
|
||||
136 153 149
|
||||
200 192 128
|
||||
224 104 128
|
||||
200 112 152
|
||||
176 64 104
|
||||
|
||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 838 B |
@ -5,13 +5,13 @@ JASC-PAL
|
||||
248 244 244
|
||||
232 208 136
|
||||
225 220 64
|
||||
224 216 208
|
||||
248 248 248
|
||||
196 203 194
|
||||
200 160 80
|
||||
232 56 40
|
||||
104 208 152
|
||||
59 105 101
|
||||
140 82 158
|
||||
56 160 104
|
||||
75 74 26
|
||||
56 160 104
|
||||
105 44 76
|
||||
|
||||
@ -8,10 +8,10 @@ JASC-PAL
|
||||
128 96 64
|
||||
224 192 64
|
||||
192 128 0
|
||||
229 229 247
|
||||
96 32 0
|
||||
224 128 64
|
||||
229 229 247
|
||||
192 96 64
|
||||
224 128 64
|
||||
0 0 0
|
||||
0 0 0
|
||||
0 0 0
|
||||
|
||||
@ -8,10 +8,10 @@ JASC-PAL
|
||||
96 88 80
|
||||
176 192 72
|
||||
48 40 24
|
||||
229 229 247
|
||||
48 40 24
|
||||
136 152 72
|
||||
96 104 48
|
||||
229 229 247
|
||||
137 153 67
|
||||
179 206 83
|
||||
0 0 0
|
||||
0 0 0
|
||||
0 0 0
|
||||
|
||||
|
Before Width: | Height: | Size: 895 B After Width: | Height: | Size: 863 B |