Merge branch 'upcoming' into scriptCommands

This commit is contained in:
psf 2024-08-27 21:31:14 -07:00 committed by GitHub
commit e7023088ed
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
462 changed files with 6071 additions and 4426 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
View File

@ -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 ###

View 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?

View File

@ -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

View File

@ -1 +0,0 @@
lman

View File

@ -1,10 +0,0 @@
gFlashTimeoutFlag
PollFlashStatus
WaitForFlashWrite
ProgramFlashSector
gFlash
ProgramFlashByte
gFlashNumRemainingBytes
EraseFlashChip
EraseFlashSector
gFlashMaxTime

View File

@ -1,3 +0,0 @@
gApprenticePartyMovesData
gApprenticeQuestionData
gApprenticeFunc

View File

@ -1,3 +0,0 @@
gMonShrinkDuration
gMonShrinkDelta
gMonShrinkDistance

View File

@ -1,3 +0,0 @@
gBattlerControllerFuncs
gBattleControllerData
gBattlerControllerEndFuncs

View File

@ -1 +0,0 @@
gFactorySelect_CurrentOptionFunc

View File

@ -1,7 +0,0 @@
gPreBattleCallback1
gBattleMainFunc
gBattleResults
gLeveledUpInBattle
gHealthboxSpriteIds
gMultiUsePlayerCursor
gNumberOfMovesToChoose

View File

@ -1 +0,0 @@
gFrontierTempParty

View File

@ -1 +0,0 @@
gInGameOpponentsNo

View File

@ -1 +0,0 @@
gWindowTileAutoAllocEnabled

View File

@ -1 +0,0 @@
gContestRngValue

View File

@ -1,4 +0,0 @@
gContestMonPixels
gImageProcessingContext
gContestPaintingWinner
gContestPaintingMonPalette

View File

@ -1 +0,0 @@
gEReaderData

View File

@ -1 +0,0 @@
gCB2_AfterEvolution

View File

@ -1,3 +0,0 @@
sPlayerToMewDeltaX
sPlayerToMewDeltaY
sMewDirectionCandidates

View File

@ -1,3 +0,0 @@
gFieldCamera
gTotalCameraPixelOffsetY
gTotalCameraPixelOffsetX

View File

@ -1 +0,0 @@
gSelectedObjectEvent

View File

@ -1 +0,0 @@
gScrollableMultichoice_ListMenuTemplate

View File

@ -1 +0,0 @@
gBackupMapLayout

View File

@ -1,10 +0,0 @@
gCanvasColumnStart
gCanvasPixels
gCanvasRowEnd
gCanvasHeight
gCanvasColumnEnd
gCanvasRowStart
gCanvasMonPersonality
gCanvasWidth
gCanvasPalette
gCanvasPaletteStart

View File

@ -1,2 +0,0 @@
gIntroFrameCounter
gMultibootProgramStruct

View File

@ -1,5 +0,0 @@
gRfuSlotStatusUNI
gRfuSlotStatusNI
gRfuLinkStatus
gRfuStatic
gRfuFixed

View File

@ -1 +0,0 @@
gRfuSIO32Id

View File

@ -1 +0,0 @@
gSTWIStatus

View File

@ -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

View File

@ -1,2 +0,0 @@
gRfuAPIBuffer
gRfu

View File

@ -1,2 +0,0 @@
gListMenuOverride
gMultiuseListMenuTemplate

View File

@ -1,4 +0,0 @@
gFlashMemoryPresent
gSaveBlock1Ptr
gSaveBlock2Ptr
gPokemonStoragePtr

View File

@ -1,12 +0,0 @@
gSoundInfo
gPokemonCrySongs
gPokemonCryMusicPlayers
gMPlayInfo_BGM
gMPlayJumpTable
gCgbChans
gMPlayInfo_SE1
gMPlayInfo_SE2
gPokemonCryTracks
gPokemonCrySong
gMPlayMemAccArea
gMPlayInfo_SE3

View File

@ -1,10 +0,0 @@
gKeyRepeatStartDelay
gLinkTransferringData
gMain
gKeyRepeatContinueDelay
gSoftResetDisabled
gIntrTable
gLinkVSyncDisabled
IntrMain_Buffer
gPcmDmaCounter
gAgbMainLoop_sp

View File

@ -1 +0,0 @@
gBardSong

View File

@ -1,8 +0,0 @@
gOverworldTilemapBuffer_Bg2
gOverworldTilemapBuffer_Bg1
gOverworldTilemapBuffer_Bg3
gHeldKeyCodeToSend
gFieldCallback
gFieldCallback2
gLocalLinkPlayerId
gFieldLinkPlayerCount

View File

@ -1 +0,0 @@
gItemUseCB

View File

@ -1,2 +0,0 @@
gUnusedPokedexU8
gPokedexVBlankCB

View File

@ -1 +0,0 @@
gDexCryScreenState

View File

@ -1,2 +0,0 @@
gRngValue
gRng2Value

View File

@ -1 +0,0 @@
gLocalTime

View File

@ -1,13 +0,0 @@
gLastWrittenSector
gLastSaveCounter
gLastKnownGoodSector
gDamagedSaveSectors
gSaveCounter
gReadWriteSector
gIncrementalSectorId
gSaveUnusedVar
gSaveFileStatus
gGameContinueCallback
gRamSaveSectorLocations
gSaveUnusedVar2
gSaveAttemptStatus

View File

@ -1 +0,0 @@
gDisableMusic

View File

@ -1,2 +0,0 @@
gOamMatrixAllocBitmap
gReservedSpritePaletteCount

View File

@ -1 +0,0 @@
gMenuCallback

View File

@ -1 +0,0 @@
gTasks

View File

@ -1,4 +0,0 @@
gFonts
gDisableTextPrinters
gCurGlyph
gTextFlags

View File

@ -1,5 +0,0 @@
gWhichTrainerToFaceAfterBattle
gPostBattleMovementScript
gApproachingTrainers
gNoOfApproachingTrainers
gTrainerApproachedPlayer

View File

@ -1,4 +0,0 @@
sCurTVShowSlot
sTV_SecretBaseVisitMovesTemp
sTV_DecorationsBuffer
sTV_SecretBaseVisitMonsTemp

View File

@ -1,2 +0,0 @@
gTransparentTileNumber
gWindowBgTilemapBuffers

View File

@ -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 @@@@@@@@@@@@@@@@@@@@@@@

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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]()

View File

@ -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 expansions AI Flags and briefly describes the effect they have on the AIs 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 AIs mon and the AIs 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 doesnt 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 doesnt 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. Ill summarize some of its scoring as follows:
@ -83,7 +83,7 @@ With respect to the AIs 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 players 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.

View File

@ -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

View File

@ -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.
![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/26b9b984-c5db-4dac-85f7-5fc4e95a32ce) ![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/d490eb30-ce54-4b90-bb2e-79c2e9bb50ac)

View File

@ -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

View 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-->

View File

@ -122,7 +122,10 @@
### Fixed
* N/A
## 📦 Pret merges 📦
## 📦 Branch Synchronisation 📦
### pret's base pokeemerald
* N/A
### merrp/aarant's followers
* N/A

View File

@ -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,

View File

@ -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:
```
![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3759dd4c-8da5-4b1c-9a50-b9e9d0815e7f)
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,

View File

@ -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:
```
![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3759dd4c-8da5-4b1c-9a50-b9e9d0815e7f)
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,

View File

@ -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:
```
![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3759dd4c-8da5-4b1c-9a50-b9e9d0815e7f)
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(

View File

@ -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(

View File

@ -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)

View File

@ -0,0 +1,2 @@
## Running documentation website locally
- [Ubuntu WSL1/WSL2](/docs/local_mdbook/ubuntu_WSL.md)

View 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 :)

View File

@ -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);

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 946 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1001 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 737 B

After

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 983 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -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

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 682 B

After

Width:  |  Height:  |  Size: 654 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 623 B

After

Width:  |  Height:  |  Size: 641 B

View File

@ -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

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 897 B

After

Width:  |  Height:  |  Size: 877 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 467 B

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 524 B

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 838 B

View File

@ -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

View File

@ -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

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 895 B

After

Width:  |  Height:  |  Size: 863 B

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